2016-09-02 18 views
1

新しいFirebaseを使用していて、特定のオブジェクトを取得するためにデータベースを複数回呼び出しています。コールバックでは、オブジェクトをCollectionViewデータソースに追加してからcollectionView.insertItemsAtIndexPathsを呼び出します。CollectionViewに挿入すると無効な更新エラーが発生する

しかし、無効な更新エラーが発生しています。私は、アイテムが次のアイテムが開始する前に最後の更新が完了していないデータベースから非常に速く検索されているため、これが推測しています。これをどうすれば解決できますか?

また、コールバック内でメインスレッドにdispatch_asyncする必要がありますか?

+0

でそれらを同期する必要がありますか? –

答えて

0

UICollectionViewの場合、numberOfItemsInSection:によって返されるアイテムの数は、ブロック内のライブアップデート中のアイテムの数と一致する必要があります。この不一致を解決するには、コレクションビューに表示するアイテムの数を数え、それをyourArray.countの代わりに返す整数を維持する必要があります。また、あなたはこの整数を維持する必要がありますyourCollectionView.performBatchUpdates({})

0

データソースは、そのアイテムは、その後performBatchUpdatesUICollectionViewcollectionView(_:numberOfItemsInSection:)は、更新後のアイテム数を返します。更新すると呼ばれていた、最初のカウント更新し、それがcollectionView.performBatchUpdatesを混乱させる。

策:この問題は、前が完了する前にクエリが呼び出されるということであれば解決策は単純ですperformBatchUpdatesクロージャ内でそれをカウントし、更新するアイテムとして

func updateItems(updates: [ItemUpdate]) { 
    collectionView.performBatchUpdates({ 
     for update in updates { 
      switch update { 
     case .Add(let index): 
       collectionView.insertItemsAtIndexPaths([NSIndexPath(forItem: index, inSection: 0)]) 
       itemCount += 1 
      case .Delete(let index): 
       collectionView.deleteItemsAtIndexPaths([NSIndexPath(forItem: index, inSection: 0)]) 
       itemCount -= 1 
      } 
     } 
    }, completion: nil) 
} 
2

をプロパティを追加します。

あなたは、最後のものを除いて、すべての機能に問い合わせを行い、それを1つずつ呼び出すでしょう。

queryOneとqueryTwoの2つのクエリがあるとします。次の答えのいずれかがあなたを助けました

func queryOne(completion: Result<Void> -> Void) { 

//Below the line that you complete the query 
//Usually after the for loop if you have 
completion(.Success()) 

} 

func queryTwo() { 


} 

は、今すぐあなたのviewDidLoad

queryOne() { result in 
      switch result { 
      case .Success: 
       self.locationManager.delegate = self 
       queryTwo() 

      case .Failure(_): break // Handle error 
      } 



     } 
関連する問題