dispatch_get_main_queue在Swift 3

时间:2017-04-11 07:30:53

标签: ios swift multithreading firebase

我知道有这样的问题,但它的工作方式与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项

所以似乎存在线程问题。有谁知道我怎么能像以前一样工作?提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

这不是任何线程问题,它与您的数据源有关。您的数据源未相应更新。您应该在重新加载UICollectionView之前检查数据源,因为您没有重新加载UICollectionView reloadItemsAtIndexPaths:,并且由于数据项计数不匹配,它会发生。