0

Core Data(人)からのデータを表示するUITableViewがあります。テーブルをスクロールするとき、Webから個人のプロファイル画像を(非同期で)フェッチし、完了したらCoreDataオブジェクトとセルの画像ビューを更新します。

ただし、- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {画像をCore Dataに保存するたびにが発生するため、問題が発生しています(ユーザーが下にスクロールすると、最終的にアプリの速度が低下します)。controllerDidChangeContent:テーブルビューでreloadDataを呼び出すと、もちろんフレームレートが大幅に低下します。

ダウンロードした画像をコアデータオブジェクトに保存し、セルを適切に更新する方法についての推奨事項はありますか?

ありがとう。

4

1 に答える 1

2

役立つ可能性がある、より詳細な変更に対応できNSFetchedResultsControllerます (コード例を参照)。

UITableView でのスクロールを改善する方法、特に画面上の行だけに処理量を制限しようとする手法について説明している、今年の WWDC (2012) のセッションをご覧になることもできます:セッション 211 - iOS での同時ユーザー インターフェイスの構築

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView beginUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller
   didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath
     forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath {        
        switch(type)
        {
            case NSFetchedResultsChangeInsert:
                [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;

            case NSFetchedResultsChangeDelete:
                [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;

            case NSFetchedResultsChangeUpdate:
                [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;

            case NSFetchedResultsChangeMove:
                [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;
        }
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];
}
于 2012-07-16T15:35:53.170 に答える