发布到 Firebase 时,单元格会重复多次

2024-05-05

我正在制作一个可以发布消息的应用程序。我将数据存储在 Firebase 中。当我发布新消息时,该特定单元格会重复多次(因此我会看到该帖子 2、​​3、4 次或更多次)。但这只是 Firebase 中的一篇文章。当我刷新屏幕(例如对数据进行排序)时,它又只是一篇文章。我究竟做错了什么?

这是我的相关代码:

    override func viewDidLoad() {
    super.viewDidLoad()

    DataService.ds.REF_POSTS.observeEventType(.Value, withBlock:  { snapshot in
        let sortByDate = NSUserDefaults.standardUserDefaults().boolForKey("sortByDate")
        if sortByDate == true {
            self.sortingByDate()
            self.tableView.reloadData()
        } else {
            self.sortingByLikes()
            self.tableView.reloadData()
        }
    })
}

按日期排序数据:

func sortingByDate() {
    NSUserDefaults.standardUserDefaults().setBool(true, forKey: "sortByDate")
    sortDateBtn.setTitleColor(UIColor(red: 255/255, green: 102/255, blue: 102/355, alpha: 1.0), forState: .Normal)
    sortLikeBtn.setTitleColor(UIColor(red: 76/255, green: 76/255, blue: 76/355, alpha: 1.0), forState: .Normal)

    if (searchController.active) {
        self.posts = []
        DataService.ds.REF_POSTS.queryOrderedByChild("timestamp").observeEventType(.ChildAdded, withBlock: { snapshot in
            if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
                let key = snapshot.key
                let post = Post(postKey: key, dictionary: postDict)
                self.posts.insert(post, atIndex: 0)
            }
            if let searchText = self.searchController.searchBar.text {
                self.filterContent(searchText)
                self.tableView.reloadData()
            }
        })
    } else {
        self.posts = []
        DataService.ds.REF_POSTS.queryOrderedByChild("timestamp").observeEventType(.ChildAdded, withBlock: { snapshot in
            if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
                let key = snapshot.key
                let post = Post(postKey: key, dictionary: postDict)
                self.posts.insert(post, atIndex: 0)
            }
            self.tableView.reloadData()
        })
    }
}

按喜欢对数据进行排序:

func sortingByLikes() {
    NSUserDefaults.standardUserDefaults().setBool(false, forKey: "sortByDate")
    sortLikeBtn.setTitleColor(UIColor(red: 255/255, green: 102/255, blue: 102/355, alpha: 1.0), forState: .Normal)
    sortDateBtn.setTitleColor(UIColor(red: 76/255, green: 76/255, blue: 76/355, alpha: 1.0), forState: .Normal)

    if (searchController.active) {
        self.posts = []
        DataService.ds.REF_POSTS.queryOrderedByChild("likes").observeEventType(.ChildAdded, withBlock: { snapshot in
            if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
                let key = snapshot.key
                let post = Post(postKey: key, dictionary: postDict)
                self.posts.insert(post, atIndex: 0)
            }
            if let searchText = self.searchController.searchBar.text {
                self.filterContent(searchText)
                self.tableView.reloadData()
            }
        })
    } else {
        self.posts = []
        DataService.ds.REF_POSTS.queryOrderedByChild("likes").observeEventType(.ChildAdded, withBlock: { snapshot in
            if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
                let key = snapshot.key
                let post = Post(postKey: key, dictionary: postDict)
                self.posts.insert(post, atIndex: 0)
            }
            self.tableView.reloadData()
        })
    }
}

发布到 Firebase:

func postToFirebase(imgUrl: String?) {
    let imageForProfile = NSUserDefaults.standardUserDefaults().valueForKey("profileImage")
    var post: Dictionary<String, AnyObject> = [
        "title": titleTextField.text!,
        "description": descriptionTextField.text!,
        "likes": 0,
        "location": locationTextField.text!,
        "username": usernameDisplay.text!,
        "uid": NSUserDefaults.standardUserDefaults().valueForKey(KEY_UID)!,
        "img": String(imageForProfile!),
        "timestamp": NSDate.timeIntervalSinceReferenceDate(),
        "lat": lat,
        "long": long,
        ]

        if imgUrl != nil {
            post["imageUrl"] = imgUrl
        }

let firebasePost = DataService.ds.REF_POSTS.childByAutoId()
let url = NSURL(fileURLWithPath: "\(firebasePost)")
let lastComponent = url.lastPathComponent

    if lastComponent != nil {
        post["postKey"] = lastComponent!
    }

firebasePost.setValue(post)

titleTextField.text = ""
descriptionTextField.text = ""
locationTextField.text = ""
imageField.image = UIImage(named: "camera")
imageSelected = false

NSUserDefaults.standardUserDefaults().setBool(true, forKey: "sortByDate")
}

表格视图:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCellWithIdentifier("PostCell") as? PostCell {
        let postList = searchController.active ? searchResult[indexPath.row] : posts[indexPath.row]
        let post = postList
        cell.request?.cancel()

        var image: UIImage?
        if let url = post.postImgUrl {
            image = FeedVC.imageCache.objectForKey(url) as? UIImage
        }

        var image2: UIImage?
        if let url2 = post.userImgUrl {
            image2 = FeedVC.imageCache.objectForKey(url2) as? UIImage
        }

        cell.configureCell(post, img: image, img2: image2)

        return cell
    } else {
        return PostCell()
    }
}

我的 cell.configurecell 实现:

    func configureCell(post: Post, img: UIImage?, img2: UIImage?) {
    self.post = post
    likeRef = DataService.ds.REF_USER_CURRENT.childByAppendingPath("likes").childByAppendingPath(post.postKey)

    self.descriptionText.text = post.postDescription
    self.descriptionText.scrollRangeToVisible(NSMakeRange(0, 0))
    self.likes = post.likes
    self.likesLbl.text = "\(post.likes) likes"
    self.postTitle.text = post.postTitle
    self.postLocation.text = post.postLocation
    self.username.text = post.username
    self.postKeyLbl.text = post.key
    self.lat = post.lat
    self.long = post.long

    if post.postImgUrl != nil {
        if img != nil {
            self.showcaseImg.image = img
        } else {
            request = Alamofire.request(.GET, post.postImgUrl!).validate(contentType: ["image/*"]).response(completionHandler: { request, response, data, err in
                if err == nil {
                    let _img = UIImage(data: data!)!
                    self.showcaseImg.image = img
                    FeedVC.imageCache.setObject(_img, forKey: self.post.postImgUrl!)
                } else {
                    print(err.debugDescription)
                }
            })
        }
    } else {
        self.showcaseImg.hidden = true
    }

    if post.userImgUrl != nil {
        if img2 != nil {
            self.profileImg.image = img2
        } else {
            request = Alamofire.request(.GET, post.userImgUrl!).validate(contentType: ["image/*"]).response(completionHandler: { request, response, data, err in
                if err == nil {
                    let _img2 = UIImage(data: data!)!
                    self.profileImg.image = img2
                    FeedVC.imageCache.setObject(_img2, forKey: self.post.userImgUrl!)
                } else {
                    print(err.debugDescription)
                }
            })
        }
    } else {
        print("no image")
    }

    likeRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
        if snapshot.value is NSNull {
            self.likesImg.image = UIImage(named: "heart")
        } else {
            self.likesImg.image = UIImage(named: "heart-filled")
        }
    })

    let getUid = NSUserDefaults.standardUserDefaults().valueForKey(KEY_UID)
    if String(getUid!) == (self.post.postUid) {
        editBtn.hidden = false
        delBtn.hidden = false

        let usernameDefaults = NSUserDefaults.standardUserDefaults().valueForKey("username")
        if usernameDefaults != nil {
            username.text = String(usernameDefaults!)
        }

        let checkIfImageChanged = NSUserDefaults.standardUserDefaults().boolForKey("imgIsChanged")
        if checkIfImageChanged == true {
            self.changePost()
            NSUserDefaults.standardUserDefaults().setBool(false, forKey: "imgIsChanged")
        }
    } else {
        editBtn.hidden = true
        delBtn.hidden = true
    }

    mapVC.markerTitle = postTitle.text
    mapVC.markerSnippet = postLocation.text
    mapVC.markerLat = lat
    mapVC.markerLong = long
}

感谢您的帮助!


由于您使用的是委托方法tableView.dequeueReusableCellWithIdentifier,当您请求一个新的单元格时,如果您不使用新数据更新新单元格,它将带来一个包含旧数据的单元格。为了确定我需要见见你cell.configureCell执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发布到 Firebase 时,单元格会重复多次 的相关文章

  • “不能在集合中使用 in/contains 运算符”

    单击搜索栏时出现此错误 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 无法在集合中使用 in contains 运算符 Assignment 4 SearchResult studentID
  • SwiftUI 检测用户何时截取屏幕截图或屏幕录制

    On UIViewController我们可以轻松地将观察者添加到控制器 喜欢 class ViewController UIViewController override func viewDidLoad super viewDidLoa
  • Swift 结构类型集

    说我有一个struct 可以是任何东西 struct Cube var x Int var y Int var z Int var width Int 然后我该如何创建一个Set这些点中 是否存在两个具有相同属性的对象 let points
  • 如何为所有整数类型创建通用整数到十六进制函数?

    我想为所有整数类型创建一个整数到十六进制函数 对于1字节的Int8 它返回两个字母 例如0A 对于2字节的Int16 它返回四个字母 例如0A0B 对于8字节的Int64 它返回16个字母 例如0102030405060708 func h
  • 如何在 iPad 应用程序上禁用横向方向?

    我创建了一个全新的单视图 iOS 通用 Swift 应用程序 然后 我在应用程序设置中取消选中 横向左 和 横向右 我在 iPhone 上运行了它 万岁 无论我如何旋转手机 它都会保持纵向模式 然后我在 iPad 上运行它 它会旋转到任何内
  • 视频中的图像/文本叠加 swift

    我正在使用 swift 在视频中使用图像叠加来实现水印效果 我正在使用AVFoundation为此 但不知何故我没有成功 以下是我的覆盖图像 文本的代码 let path NSBundle mainBundle pathForResourc
  • UIImageWriteToSavedPhotosAlbum 选择器语法问题

    努力让 UIImageWriteToSavedPhotosAlbum 快速工作https developer apple com library ios documentation UIKit Reference UIKitFunction
  • 如何删除以前的 ViewController

    我是一名学生 对编程还很陌生 我正在尝试在业余时间学习 Objective C Swift 我使用 spriteKit 和 swift 制作了一个游戏 有多个菜单 场景 我正在尝试从一个视图控制器转换到另一个视图控制器 为此 我使用了以下代
  • Swift 中的 preg_match 等效项

    我尝试将 PHP 函数转换为 Swift 该函数用于根据 my 正则表达式将字符串格式化为另一个字符串 这就是我在 PHP 中所做的 preg match P 0 9 Y 0 9 M 0 9 D T 0 9 H 0 9 M 0 9 0 9
  • Firebase Analytics 如何定义会话?

    Firebase Analytics 有许多有关 会话 的统计数据 例如 每个用户的会话数 和 平均会话长度 但 Firebase Analytics 到底如何定义会话呢 我会回答我的问题 Firebase Analytics 将会话定义为
  • 在 Xcode 6 - Swift 中使用自定义字体 [重复]

    这个问题在这里已经有答案了 我是斯威夫特新手 我想知道如何在 Xcode 6 的 swift 应用程序中使用自定义字体 您只需将字体文件 ttf 拖到 Xcode 左侧窗格的资源区域中即可 当您将其放入时 会出现一个对话框 确保您的应用程序
  • 带有预填充 .sqlite 的核心数据 (Swift3)

    目前 我正在对现有 iOS9 应用程序进行 Swift3 iOS10 更新 该应用程序存储了欧洲各地约 10 000 个电动汽车充电点 到目前为止 我总是为应用程序提供预填充的数据库 xcappdata 包中的 sqlite sqlite
  • 如何在 ios 应用程序中将 .svg url 显示为图像

    我从服务器获取 svg 网址 如何在我的应用程序中将其显示为图像 我尝试在 UIWebView 中显示它 但无法调整内容图像的大小 我正在使用这个代码 let request NSURLRequest NSURLRequest url UR
  • 如何找到安全区域的高度和宽度?

    我正在尝试以编程方式为某些标签 按钮和文本字段设置相对于安全区域的高度和宽度的约束 例如 我希望将标签到安全区域顶部的距离设置为安全区域高度的 10 如何检索安全区域的高度和宽度 这是一个合理的方法吗 我的想法是 无论 iOS 设备如何 我
  • 从 firebase swift 读取数据

    我正在尝试从 firebase 数据库检索数据 但是当我运行代码时 它没有显示任何内容 但没有显示错误 我从Firebase手册中得到了这段代码 顺便说一句 我很确定路径是正确的 let ref FIRDatabase database r
  • com.google.firebase.provider.FirebaseInitProvider:java.lang.ClassNotFoundException:com.google.firebase.provider.FirebaseInitProv

    收到此错误KitKat和较低版本完美运行在 Lollipop 及以上版本 我已将所有必需的 jar 包含在 cradle 和 Firebase json 文件中以接收 GCM 我的应用程序梯度 apply plugin com androi
  • 如何取消 Alamofire.upload

    我正在通过以下方式将图像上传到服务器上Alamofire upload作为多部分数据 不像Alamofire request它没有回来Request对象 我通常用它来取消请求 但是能够取消上传这样的消耗性请求是非常合理的 阿拉莫菲尔有哪些选
  • 如何实现pickerView类的didSelectRow方法?

    我以前从未使用过选择器视图 我认为它类似于表视图类的 func tableView tableView UITableView didDeselectRowAtIndexPath indexPath NSIndexPath 方法 但是我无法
  • 如何比双击更快地识别单击?

    我有一个UITableView与我添加单击的行and双击手势 let doubleTap UITapGestureRecognizer target self action doubleTap doubleTap numberOfTapsR
  • 如何以编程方式添加 NSMenu?

    我没有使用storyboard和xib 只使用了代码 我想以编程方式添加 编辑 菜单 我的问题是 1 如何显示 编辑 菜单 评论问题1 需要输入什么代码 2 Swift 提供了复制和粘贴等操作吗 class TestManager NSOb

随机推荐

  • 在 Three.js 中使用多种材质来合并几何体

    我想使用 2 个网格创建一棵松树 其中 1 个用于树干 另一个用于灌木 这就是我所做的 var pine geometry new THREE Geometry var pine texture 1 THREE ImageUtils loa
  • 我可以在 WinRT / Windows 8 Store 应用程序中绑定 DynamicObject

    我有以下代码 public class MyClass DynamicObject INotifyPropertyChanged Dictionary
  • 当用户与 DateTimePicker 控件交互时会引发什么事件?

    我是 C 新手 在我的程序中使用 DateTimePicker Value Changed 事件 但我发现当用户单击箭头时发生 ValueChanged 事件 或者如果也以编程方式更改值 我只想识别 DateTimePicker 的用户交互
  • Erl 无法连接到本地 EPMD。为什么?

    Erlang R14B04 erts 5 8 5 source 64 bit rq 1 async threads 0 kernel poll false Eshell V5 8 5 abort with G root ip 10 101
  • OWIN 令牌身份验证 400 来自浏览器的 OPTIONS 错误请求

    我正在根据这篇文章对小型项目使用令牌身份验证 http bitoftech net 2014 06 09 angularjs token authentication using asp net web api 2 owin asp net
  • Android从Activity调用Service中的方法

    我想调用一个方法Service对象来自一个Activity对象 但是我发现不可能从MainActivity通常情况下 我希望我的代码能更好地解释我的意思 Service public class Timer extends Service
  • 后备图像的角度指令

    如果单独服务器上的图像不存在 我想显示默认图像 是否有角度指令来完成此任务 不 但您可以创建一个 http jsfiddle net FdKKf http jsfiddle net FdKKf HTML img JS myApp direc
  • 无法在IntelliJ IDEA中编译和运行java代码

    使用 IntelliJ IDEA 版本 12 1 6 我想运行 Horstmann Core Java 书中的示例 public class Welcome public static void main String args Strin
  • 为 Mercurial 执行 hgweb.cgi 时,指定的 CGI 应用程序行为不当...

    我有 IIS 6 我将 Mercurial 安装在 c program files mercurial 中 我在 c program files python 中安装了 Python 2 6 I added extension handli
  • antisamy 解析器强制关闭标签

    我使用 Antisamy 来验证 HTML 我的政策允许 iframe 例如 YouTube 视频 问题是 如果标签为空 像这样 清洗后会是这样的 但它应该有正常的结束标签 这会破坏之后页面上的所有内容 我已经将指令设置为使用大部分 HTM
  • 为什么多表连接会产生重复行?

    假设我有三个表 A B 和 C 每个表都有两列 一个主键和一些其他数据 它们每个都有相同的行数 如果我JOIN主键上的 A 和 B 我最终应该得到与其中任何一个相同的行数 而不是 A rows B rows 现在 如果我JOIN A JOI
  • 如何从 OnChange 事件捕获文本框的值

    在我的 C MVC 应用程序中 我有一系列这样生成的文本框 foreach object item in items Html TextBox 渲染的结果是一系列看起来像这样的文本框
  • 如何使用 Material UI 制作一个圆形复选框?

    我尝试匹配的设计要求复选框为圆形 我正在使用 Material UI 和 React 边框半径不起作用 因为实际图标的边框不是可见复选框的边框 我不能只使用像 Font Awesome 这样的东西 因为它需要实际检查和取消检查 Curren
  • C# 中的 DateTime.Parse 抛出异常

    我不知道为什么抛出异常 这是工作代码 DateTime Parse 1 12 2012 12 00 00 AM 这是抛出异常的一个 DateTime Parse 1 13 2012 12 00 00 AM 抛出的异常是 格式异常 包括此消息
  • iPad SplitViewController 具有纵向模式菜单,如设置应用程序

    我想在我的 iPad 应用程序上获得 SplitView 其中左侧菜单处于纵向 例如 iPad 设置 现在 在纵向方向上 我有一个全屏内容视图 并且导航栏上有一个按钮 其中包含一个带有左侧菜单的弹出窗口 这就是你需要的魔法 该方法位于 UI
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • 使用 Android Intent 发送基于 HTML 的电子邮件正文

    我需要使用 android Intent extra 将基于 HTML 的内容发送到电子邮件应用程序 它接受一些标签 例如 br 但它没有显示任何锚链接或 h1 其显示像简单的文本 EDITED I have tried with gmai
  • 如何使用生成器遍历文件系统?

    我正在尝试创建一个实用程序类来遍历目录中的所有文件 包括子目录和子子目录中的文件 我尝试使用发电机 因为发电机很酷 然而 我遇到了困难 def grab files directory for name in os listdir dire
  • Pymacs 助手在 30 秒后未启动

    我见过其他关于此的问题 但没有一个得到真正的回答 而且没有一个是我的问题 我有一个新系统 emacs 23 1 Centos 6 2 我认为 我下载了最新的 pymacs 并安装了它 但是 我得到 error Pymacs helper d
  • 发布到 Firebase 时,单元格会重复多次

    我正在制作一个可以发布消息的应用程序 我将数据存储在 Firebase 中 当我发布新消息时 该特定单元格会重复多次 因此我会看到该帖子 2 3 4 次或更多次 但这只是 Firebase 中的一篇文章 当我刷新屏幕 例如对数据进行排序 时