【问题标题】:UITableViewCell image + saving to Core DataUITableViewCell 图像 + 保存到核心数据
【发布时间】:2012-07-16 13:37:28
【问题描述】:

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

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

关于如何处理图像下载和适当更新单元格后如何处理将其保存到核心数据对象的任何建议?

谢谢。

【问题讨论】:

  • 为什么需要-(void)controllerDidChangeContent?如果你这样做,你不应该调用 reloadData ,因为你正在正确地延迟加载。据我了解,您正在插入核心数据,因此该表不需要更新,因为该表首先为核心数据提供了图像。
  • 数据可能会在其他地方发生变化,所以如果数据发生变化,我想适当地更新表格。

标签: core-data uitableview


【解决方案1】:

您可以响应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];
}

【讨论】:

  • 啊,完美,我不知道reloadRowsAtIndexPaths: 方法,每次遇到NSFetchedResultsChangeUpdate 案例时,我都在重新加载单元格。谢谢!
猜你喜欢
  • 2012-05-05
  • 1970-01-01
  • 2017-07-17
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多