【发布时间】: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