2016-09-12 19 views
0

私のfollowCollectionViewがコードのこの特定の場所でリロードしていないことが判明しました。collectionView.reloadDataが正しく機能していません

func unFollowBtnPressed() { 

    if let itemPaths = followCollectionView.indexPathsForSelectedItems() { 
     unFollowPosts(itemPaths) 
    } else { 
     // No item to unfollow 
    } 

    self.followCollectionView.reloadData() 
} 

func unFollowPosts(itemPaths: [NSIndexPath]) { 

    followCollectionView.performBatchUpdates({ 

     let sortedIndexPathArray = itemPaths.sort{$1.row < $0.row} 

     for indexP in sortedIndexPathArray { 
      DataService.ds.removeFollow(PostService.ps.followingPosts[indexP.row]) 
      PostService.ps.followingPosts.removeAtIndex(indexP.row) 
     } 
     self.followCollectionView.deleteItemsAtIndexPaths(sortedIndexPathArray) 

    }) { (success: Bool) in 
    } 
} 

プログラムはreloadDataを(実行)が、cellForItemAtIndexPathは(reloadDataを呼び出して他の場所が正常に動作しますので、すべては右フックアップされる)と呼ばれることはなかったです。私はタイミングの問題だと思っています。なぜなら、データを再ロードする場所を変更して、コレクションビューを再ロードできるからです。以下は作業コードです。私は上記の方法がなぜ機能し、以下の方法がなぜそうでないかはわかりません。私は、dispatch_async(dispatch_get_main_queue())でreloadData()コードをラップしようとしていますが、それでもまだ動作しませんでしたか?

func unFollowBtnPressed() { 

    if let itemPaths = followCollectionView.indexPathsForSelectedItems() { 
     unFollowPosts(itemPaths) 
    } else { 
     // No item to unfollow 
     self.followCollectionView.reloadData() 
    } 

} 

func unFollowPosts(itemPaths: [NSIndexPath]) { 

    followCollectionView.performBatchUpdates({ 

     let sortedIndexPathArray = itemPaths.sort{$1.row < $0.row} 

     for indexP in sortedIndexPathArray { 
      DataService.ds.removeFollow(PostService.ps.followingPosts[indexP.row]) 
      PostService.ps.followingPosts.removeAtIndex(indexP.row) 
     } 
     self.followCollectionView.deleteItemsAtIndexPaths(sortedIndexPathArray) 

    }) { (success: Bool) in 
     self.followCollectionView.reloadData() 
    } 
} 
+0

'performBatchUpdates:完了:' asynchroneのようです。例えば、 'printf'を' else'に入れてみてください。最初に何が表示されているか確認してください。 – Larme

+0

私はそれを推測していましたが、reloadDataがcollectionViewを再ロードするのを止めてはいけません。(cellForRowAtIndexPathはコードの先頭にコールされません) – user172902

+0

'reloadData'を呼び出すとフラグがセットされ、リロード処理が非同期で開始されます。フラグが既に設定されている場合、新しい更新はトリガーされません。したがって、更新の途中で 'reloadData'を呼び出すことは、本質的にノーオペレーションです。 – Avi

答えて

0

あなたはこれらを試してみました:

DispatchQueue.main.async(execute: { 
    //reload 
}) 

OperationQueue.main.addOperation({ 
    //reload 
}) 
関連する問題