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