我知道有这样的问题,但它的工作方式与Swift 2
中的方式不同。我希望有人可以澄清所以我可以按照以前的方式工作!我在Swift 2
中有这个代码,它会检测firebase
中的更改,更新表中的数据,然后只重新加载更改的索引:
DataService.ds.REF_USERS.observeEventType(.ChildChanged, withBlock :{
(snapshot) in
if initialUserLoad == false {
for (index,user) in self.usersArray.enumerate() {
if user.objectForKey("uId") as! String == snapshot.key {
self.usersArray[index] = snapshot.value as! NSDictionary
dispatch_async(dispatch_get_main_queue()){[unowned self] in
self.collectionView.reloadItemsAtIndexPaths([NSIndexPath(forItem: index, inSection: 0)])
}
}
}
}
})
Swift 3
代码自动更新将其更改为:
DataService.ds.REF_USERS.observe(.childChanged, with :{
(snapshot) in
if initialUserLoad == false {
for (index,user) in self.usersArray.enumerated() {
if user.object(forKey: "uId") as! String == snapshot.key {
self.usersArray[index] = snapshot.value as! NSDictionary
DispatchQueue.main.async{[unowned self] in
self.collectionView.reloadItems(at: [IndexPath(item: index, section: 0)])
}
}
}
}
})
我现在得到的错误是:
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'尝试从更新前仅包含3个项目的第0部分删除第4项
所以似乎存在线程问题。有谁知道我怎么能像以前一样工作?提前感谢您提供的任何帮助。
答案 0 :(得分:1)
这不是任何线程问题,它与您的数据源有关。您的数据源未相应更新。您应该在重新加载UICollectionView
之前检查数据源,因为您没有重新加载UICollectionView
reloadItemsAtIndexPaths:,并且由于数据项计数不匹配,它会发生。