NSFetchedResultsController によって駆動される、300 セルのコレクションビューがあります。すべてのオブジェクトが頻繁に更新されるため、その旨を通知するデリゲート メッセージを受け取り、テーブルビューと同様にコレクション ビューで更新を処理します。残念ながら、これが発生するたびにメインスレッドが数秒間ロックされます...理由はわかりません。これが私のコードです:
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.cascadeViewController.collectionView performBatchUpdates:^{
NSLog(@"performingBatchUpdates");
for (NSDictionary *change in self.changes) {
[change enumerateKeysAndObjectsUsingBlock:^(NSNumber *key, id obj, BOOL *stop) {
NSFetchedResultsChangeType type = [key unsignedIntegerValue];
if (type == NSFetchedResultsChangeInsert) {
[self.cascadeViewController.collectionView insertItemsAtIndexPaths:@[obj]];
} else if (type == NSFetchedResultsChangeDelete) {
[self.cascadeViewController.collectionView deleteItemsAtIndexPaths:@[obj]];
} else if (type == NSFetchedResultsChangeUpdate) {
[self.cascadeViewController.collectionView reloadItemsAtIndexPaths:@[obj]];
} else if (type == NSFetchedResultsChangeMove) {
[self.cascadeViewController.collectionView moveItemAtIndexPath:obj[0] toIndexPath:obj[1]];
}
}];
}
NSLog(@"performingBatchUpdates end");
} completion:^(BOOL finished) {
NSLog(@"completion");
// TODO: implement
// [self configureMessageAndFooterView];
}];
NSLog(@"end of method");
[self.changes removeAllObjects];
}
何が起きてる?一度に 300 個のオブジェクトすべてが更新されることは、アプリの実際の実行では常に発生するわけではありませんが、心配する必要があるほど十分です。ストック UICollectionViewFlowLayout を使用しています - もっとカスタムする必要がありますか?