【问题标题】:Firestore addSnapshotListener Replacing Object Data upon New Object EntryFirestore addSnapshotListener 在新对象条目时替换对象数据
【发布时间】:2018-03-20 09:12:39
【问题描述】:

我有以下功能;

func observePosts() {
    let postReference = Firestore.firestore().collection("Posts").limit(to: 20).order(by: "postTimestamp", descending: true)
    postReference.addSnapshotListener { (snapshot, error) in
        if error != nil {
            print(error as Any)
            return
        } else {
            guard let snapshot = snapshot else { return }
            let models = snapshot.documents.flatMap({Post(dictionary: $0.data())})
            self.posts = models
            DispatchQueue.main.async {
                self.feedCollection.reloadData()
            }
        }
    }
}

这将返回集合下的所有文档。

但是,当我按照以下添加另一个对象时;

uploadMedia { (url) in
        if url != nil {
            let postIDReference = self.postsReference.collection("Posts").document().documentID
            self.postsReference.collection("Posts").document().setData([
                "postID" : postIDReference,
                "postImageURL" : url!,
                "postTimestamp" : 1234567890
                ], completion: { (error) in
                if error != nil {
                    print(error as Any)
                    return
                } else {
                    picker.dismiss(animated: true, completion: nil)
                }
            })
        }
    }
}

这会用新的 setData 对象覆盖一个单元格。我已经阅读了一些关于 SO 的类似问题,但大多数与没有自动 ID 密钥有关

self.postsReference.collection("Posts").document().setData(

给我。

我尝试过的:

终止应用并重新打开会为我提供 Firestore 中的所有对象。 Firestore 仪表板包含所有对象(因此不存在丢失数据的问题)。

这是我的委托和数据源方法

    extension FeedController: UICollectionViewDelegate, UICollectionViewDataSource 
{

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection 
section: Int) -> Int {
        return posts.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt 
indexPath: IndexPath) -> UICollectionViewCell {
        let feedCell = feedCollection.dequeueReusableCell(withReuseIdentifier: 
"cell", for: indexPath) as! PostCell
        let post = posts[indexPath.item]
        feedCell.post = post
        return feedCell
    }
}

CollectionView 单元格

import UIKit
import SDWebImage

class PostCell: UICollectionViewCell {

    @IBOutlet weak var postImage: UIImageView!

    var post: Post? {
        didSet {
            guard let post = post else { return }
            let postImageURL: URL = URL(string: (post.postImageURL))!
            postImage.sd_setImage(with: postImageURL) { (image, error, cache, url) 
in
                self.postImage.image = image
            }
        }
    }
}

任何帮助表示赞赏 - 一如既往的非常感谢。

【问题讨论】:

  • 我相信没有必要,因为当有一个新对象时,快照应该更新并再次调用 observePosts()。其中有一个 .reloadData 。此外,在设备上添加新帖子时,模拟器会显示相同的行为。我认为问题在于读取数据而不是写入数据。
  • 澄清一下:您的问题是当您创建新文档时,它们会替换 UITableView 中的现有单元格吗? (但 Firestore 中有新文档?)
  • 是的。这正是正在发生的事情。无论我上传多少对象,它总是会覆盖现有对象之一。
  • 您是否尝试在闭包的执行之间比较您的self.posts?您可以尝试将问题隔离到 UITableViewDataSource / loading vs Firestore 检索。
  • 我刚刚检查了我的 self.posts.count。最初,我有 10 个帖子。我创建并上传了另一个。它在控制台中打印 self.posts.count 为 11。但是,在我的 collectionView 中,我只有 10 个帖子?再次杀死应用程序并重新打开它会在我的 collectionView 中给我 11。

标签: swift firebase object google-cloud-firestore


【解决方案1】:

问题是我的自定义 flowLayout。我认为在检索新项目时需要使布局无效。

【讨论】:

    猜你喜欢
    • 2020-11-16
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多