0

我有一个 UITableView,我在其中显示来自核心数据(人)的数据。滚动表格时,我从网络(异步)获取该人的个人资料图像,并在完成后更新 Core Data 对象以及单元格的图像视图。

但是,我遇到了一个问题,因为- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {每次我将图像保存到 Core Data 时都会触发(一旦用户向下滚动,最终会减慢应用程序的速度)。在controllerDidChangeContent:我调用表视图上的 reloadData 时,这当然是帧速率急剧下降的原因。

一旦下载并适当更新单元格,如何处理将图像保存到核心数据对象的任何建议?

谢谢。

4

1 回答 1

2

您可以响应NSFetchedResultsController可能有帮助的更精细的更改(请参阅示例代码)。

您可能还想看看今年 WWDC (2012) 中的一个会话,该会话讨论了如何改进 UITableView 中的滚动,特别是尝试将处理量限制为仅在屏幕上的那些行的技术:会话 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 回答