我有一个UITableView,我在其中显示来自Core Data(人员)的数据。滚动表格时,我从网络上获取(异步)人物的个人资料图像,并在完成后更新核心数据对象以及单元格的图像视图。
但是,我遇到了一个问题,因为每次将图像保存到Core Data时都会触发- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
(一旦用户向下滚动,最终会降低应用程序的速度)。在controllerDidChangeContent:
中,我在表视图上调用reloadData,这当然是帧速率急剧下降的原因。
有关如何处理将图像保存到核心数据对象并进行适当更新后的任何建议吗?
感谢。
答案 0 :(得分: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];
}