2

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 を使用しています - もっとカスタムする必要がありますか?

4

2 に答える 2

0

以前にこのような動作を見たことを漠然と覚えていますが、多くの問題のためにこれらのクラスの両方の使用を停止したため、 NSFetchedResultsController+コンボの解決策がありません。UICollectionViewFlowLayout私たちがオープンソース化した代替品をチェックアウトすることを検討してください:

  1. の代替としてのTLIndexPathToolsNSFetchedResultsControllerTLIndexPathControllerと非常によく似たクラスを提供しますが、プレーンNSFetchedResultsControllerな配列でも機能し、アニメートされた並べ替えとフィルタリングを行うことができます( .NSFetchedResultsController
  2. の代わりとしてのVCollectionViewGridLayoutUICollectionViewFlowLayout。これは均一な垂直スクロール グリッドであるため、 ほど柔軟ではありませんUICollectionViewFlowLayoutが、ほとんどの場合、スティッキー ヘッダー (UITableViewヘッダーなど) を使用する場合、アニメーションは一般的にはるかに優れています。UICollectionViewFlowLayoutとを切り替えVCollectionViewGridLayoutて改善を確認できるサンプル プロジェクトがいくつかあります。

約 1000 個のアイテムを含むグリッドのようなコレクション ビューを備えた iPad アプリがあり、上記により、Core Data データベースがバックグラウンドで更新されるため、優れたパフォーマンスとスムーズなアニメーションが得られます。

于 2013-07-02T17:32:43.237 に答える