以Apple的Mail应用程序为例; 假装它使用核心数据.当您触摸电子邮件帐户时,它会显示该帐户中的所有邮件.因此,控制器对该帐户中的所有消息执行了获取请求.
然后,您触摸消息并深入钻取一个级别,现在您正在查看单个消息.此消息可能是从消息列表控制器传递的,但是 - 您还可以单击右上角的三角形来浏览同一电子邮件帐户中的所有消息.这意味着用于查看单个电子邮件消息的视图控制器也需要完全相同的消息列表.
因此,您可以从列表视图中剪切并粘贴获取请求逻辑,但这不是DRY /不重复自己.
有关解决此问题的最佳实践的建议吗?
我有一个标准的分割视图控制器,带有详细视图和表格视图.按详细视图中的按钮可以使对象在表视图的排序中更改其位置.只要生成的排序更改不会导致添加或删除节,这样就可以正常工作.即一个对象可以改变它在一个部分中的排序或从一个部分切换到另一个部分.这些订购更改可以正常工作 但是,如果对象试图移动到一个尚不存在的部分,或者是留下一个部分的最后一个对象(因此要求删除它的部分),则应用程序崩溃.
NSFetchedResultsControllerDelegate具有处理添加和删除的部分的方法,在这些情况下应该调用这些部分.但是那些委托方法由于某种原因没有被调用.
有问题的代码是样板:
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
NSLog(@"willChangeContent");
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
NSLog(@"didChangeSection");
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)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
NSLog(@"didChangeObject");
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView …Run Code Online (Sandbox Code Playgroud)