2017-04-11 12 views
1

このような質問がありますが、それは私がSwift 2で行ったように動作していません。私は誰かが明確にできることを望んでいたので、これまでと同じようにこの作業を行うことができます!私はSwift 2にこのコードを持っていたし、それはその後、変更のみインデックスを再ロード、テーブル内のデータを更新し、firebaseの変化を検出します:ディスパッチ_get_main_queueがSwift 3で正常に機能していない

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)]) 
        } 
       } 
      } 
     } 
}) 

私は今取得していますエラーがある:「ITEを削除しよう:キャッチされない例外により「NSInternalInconsistencyException」、理由にアプリを終了

更新前の3つの項目のみを含むセクション0のm 4 '

スレッドの問題があるようです。誰も私が前と同じように動作させる方法を知っていますか?あなたが提供できる任意のヘルプに事前に感謝します。

+0

これはスレッドの問題ではありません。 "理由: 'セクション0から項目4を削除しようとしましたが、更新前には3つの項目のみが含まれています。そのセクションの合計アイテムよりも大きいインデックスのアイテムを削除しようとしています。 –

+0

スタックトレースを確認しましたか?どのラインがクラッシュするのですか?例外ブレークポイントを設定する – Paulw11

+0

セルをリロードしようとするとクラッシュする –

答えて

1

スレッドの問題ではなく、データソースに関連しています。データソースはそれに応じて更新されません。 UICollectionViewを再ロードする前にデータソースを確認する必要があります。UICollectionViewreloadItemsAtIndexPaths:がリロードされていないため、データ項目数の不一致が原因で発生します。

関連する問題