Objective c NSFetchedResultsController:don';t刷新每个新单元格

Objective c NSFetchedResultsController:don';t刷新每个新单元格,objective-c,core-data,nsfetchedresultscontroller,Objective C,Core Data,Nsfetchedresultscontroller,我注意到在核心数据中插入带有NSFetchedResultsController的数据将使用tableView:cellforrowatinexpath:方法刷新表视图中的每个单元格 我的应用程序首先从Web服务获取100多个项目。将它们添加到核心数据数据库时,会为每个单元格调用tableView:cellforrowatinexpath:。我希望只刷新前8-9个可见单元格。我怎样才能改变这一点?这是一个问题的原因,因为我的应用程序在第一次调用tableView:cellforrowatinex

我注意到在
核心数据中插入带有
NSFetchedResultsController
的数据将使用
tableView:cellforrowatinexpath:
方法刷新
表视图中的每个单元格

我的应用程序首先从Web服务获取100多个项目。将它们添加到核心数据数据库时,会为每个单元格调用
tableView:cellforrowatinexpath:
。我希望只刷新前8-9个可见单元格。我怎样才能改变这一点?这是一个问题的原因,因为我的应用程序在第一次调用
tableView:cellforrowatinexpath
时下载封面图像,而当为每个单元格调用它时,这不是最佳解决方案

EDIT1:
我的代码完全基于中的一个示例。我已经从第14课下载了他们的
Photomania.zip
,刚刚插入了
tableView:willDisplayCell:forrowatinexpath:
方法,该方法在调用该方法时在日志中显示项目名称。您可以在此处获取我的代码:。 正如您将看到的,似乎为表中的每个项调用了此方法?为什么?

EDIT2: 我在iOS开发者库中的
NSFetchedResultsControllerDelegate
中使用了这个方法。我发现带有RowAnimation:UITableViewRowAnimationFade的
会导致它为每个单元格调用
cellForRowAtIndexPath
willDisplayCell
。将其更改为
with RowAnimation:UITableViewRowAnimationNone
时,仅调用可见单元格

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

    switch(type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}
-(void)控制器:(NSFetchedResultsController*)控制器DIDChangeSecute:(id)sectionInfo atIndex:(nsInteger)sectionIndex for ChangeType:(NSFetchedResultsChangeType)类型{
开关(类型){
案例NSFetchedResultsChangesInsert:
[self.tableView insertSections:[NSIndexSet IndexSetWithiIndex:sectionIndex]带RowAnimation:UITableViewRowAnimationFade];
打破
案例NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet IndexSetWithiIndex:sectionIndex]带RowAnimation:UITableViewRowAnimationFade];
打破
}
}

您是否在重用您的单元(即提供单元重用标识符)

您是否正在实施
NSFetchedResultsControllerDelegate
方法,该方法允许您的视图控制器在行“联机”时插入/删除行,而不是执行
[tableView重载数据]
?在这些方法中,您应该使用“
[UITableView insertRowsAtIndexPaths:withRowAnimation:
[UITableView deleteRowsAtIndexPaths:withRowAnimations:
等”来调整引用的行


最后,您可以将图像加载逻辑移到
UITableView
委托方法
tableView:willDisplayCell:forrowatinexpath:
。这样,只有在实际显示时才会调用它。

您是否正在重用单元格(即提供单元格重用标识符)

您是否正在实施
NSFetchedResultsControllerDelegate
方法,该方法允许您的视图控制器在行“联机”时插入/删除行,而不是执行
[tableView重载数据]
?在这些方法中,您应该使用“
[UITableView insertRowsAtIndexPaths:withRowAnimation:
[UITableView deleteRowsAtIndexPaths:withRowAnimations:
等”来调整引用的行


最后,您可以将图像加载逻辑移到
UITableView
委托方法
tableView:willDisplayCell:forrowatinexpath:
。这样,它只有在实际显示时才会被调用。

是的,我使用的是
NSFetchedResultsControllerDelegate
协议,它的实现方式与文档类似:。当所有数据都可用时,NSFetchedResultsControllerDelegate将生成一个
tableView:cellForRowAtIndexPath
,这是否正常?感谢您发出有关
tableView:willDisplayCell:forrowatinexpath:
的通知。这可能会解决我的问题,但我仍然认为为每个单元格调用cell方法是不寻常的。
tableView:willDisplayCell:forrowatinexpath:
不起作用。请参阅我的编辑1。使用
NSFetchedResultsController
只有两种方法可以调用
表视图:cellForRowAtIndexPath:
,当您在表视图上显式调用
reloadData
时,或者在响应委托调用时插入/删除行/节时。您需要通过调试器监视代码中的这些区域,以查看导致完全表重新加载的原因
NSFetchedResultsCoordinator
无法直接与表视图本身交互。问题是否可能是,每次向核心数据添加新记录时,都会重新加载整个表?对我来说,这是一个意外的行为,因为它应该只刷新可见的记录。除非您明确告诉它这样做,否则表不会重新加载。据我所知,在插入新行时,它只需要请求一个单元格(如果它是可见的),或通过插入而使其可见的任何其他单元格,而不是整个表。但是,如果您有可变高度的行,则必须逐行重新计算表大小。是的,我使用的是
NSFetchedResultsControllerDelegate
协议,实现方式与文档类似:。当所有数据都可用时,NSFetchedResultsControllerDelegate将生成一个
tableView:cellForRowAtIndexPath
,这是否正常?感谢您发出有关
tableView:willDisplayCell:forrowatinexpath:
的通知。这可能会解决我的问题,但我仍然认为为每个单元格调用cell方法是不寻常的。
tableView:willDisplayCell:forrowatinexpath:
不起作用。请使用
NSFetchedResultsContro查看我的EDIT1