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()
}
}
'performBatchUpdates:完了:' asynchroneのようです。例えば、 'printf'を' else'に入れてみてください。最初に何が表示されているか確認してください。 – Larme
私はそれを推測していましたが、reloadDataがcollectionViewを再ロードするのを止めてはいけません。(cellForRowAtIndexPathはコードの先頭にコールされません) – user172902
'reloadData'を呼び出すとフラグがセットされ、リロード処理が非同期で開始されます。フラグが既に設定されている場合、新しい更新はトリガーされません。したがって、更新の途中で 'reloadData'を呼び出すことは、本質的にノーオペレーションです。 – Avi