- 编辑 * 因此,我似乎将它用于错误的目的,并且在初始提取时永远不会调用委托。我想用它来批处理获取,因为即使数据的实际获取速度很快,但后处理却不是。我只需要卸载到后台进程 * 编辑 *
我在 UIViewController 的 ViewDidLoad 方法中创建了一个 NSFetchedResultsController 并将委托设置为 self:
self.resultsController = [[[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchRequest managedObjectContext:[AppDelegate singleton].managedObjectContext sectionNameKeyPath:nil cacheName:nil] autorelease];
self.resultsController.delegate = self;
然后,当点击 ViewController 时,如果需要,我会执行获取:
int indexPathCount = self.indexPaths.count;
int objectCount = self.resultsController.fetchedObjects.count;
if (indexPathCount && objectCount)
{
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:self.indexPaths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
}
else
{
NSError* error;
BOOL success = [self.resultsController performFetch:&error];
if (!success)
{
UIAlertView* alert = [[[UIAlertView alloc] initWithTitle:@"ERROR" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
[alert show];
}
}
上面的代码不会获取任何对象,并且永远不会调用委托方法。如果我注释掉上面我将 UIViewController 分配为委托的代码行,那么在第二次运行被点击的代码期间,objectCount 将包含一个正确的值。
- 编辑 * 上面的代码现在将实际获取对象。在第二次运行代码时,objectCount 现在符合预期,但仍然没有调用委托方法。现在我的假设是我在内存管理方面做得不好,但我所有的保留计数似乎都是正确的。* 编辑*
这是委托方法的实现,但我已经检查了十几次它们的正确性:
- (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:
{
NSIndexPath* tableIndexPath = [NSIndexPath indexPathForRow:newIndexPath.row inSection:self.section];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:tableIndexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.indexPaths addObject:tableIndexPath];
} break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController*)controller
{
[self.tableView endUpdates];
}
关于为什么 NSFetchedResultsController 在提供委托时不起作用的任何想法?