2012-07-16 120 views
0

我有一个UITableView显示来自核心数据(人)的数据。当滚动浏览表格时,我从网上获取(异步)该用户的个人资料图像,并在完成后更新核心数据对象以及单元格的图像视图。UITableViewCell图像+保存到核心数据

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

有关如何处理将图像保存到核心数据对象并将其更新到适当位置的建议?

谢谢。

+0

为什么你需要'构建并发用户界面?如果你正在做你懒加载正确,你不应该调用reloadData。据我了解,你插入到核心数据,所以该表不需要更新,因为该表是首先为核心数据提供图像的。 – jacerate 2012-07-16 15:28:53

+0

数据可能在其他地方更改,所以如果数据发生更改,我想适当地更新表格。 – runmad 2012-07-16 15:36:40

回答

2

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

您可能还想看看今年的WWDC会议(2012年),讨论如何改进UITableView中的滚动,特别是尝试将处理量限制为屏幕上的那些行的技术:会话211 - (空)controllerDidChangeContent` - 在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]; 
} 
+0

啊完美,我没有意识到'reloadRowsAtIndexPaths:'方法,每次我点击'NSFetchedResultsChangeUpdate'情况下重新加载单元格。谢谢! – runmad 2012-07-16 15:54:48