0
  • 编辑 * 因此,我似乎将它用于错误的目的,并且在初始提取时永远不会调用委托。我想用它来批处理获取,因为即使数据的实际获取速度很快,但后处理却不是。我只需要卸载到后台进程 * 编辑 *

我在 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 在提供委托时不起作用的任何想法?

4

1 回答 1

0

没有足够的信息。好吧,不是正确的信息。既然你没有发帖,那我就假设...

首先,您的获取请求是什么样的?它是否正确指定了要获取的对象?它是否具有排序描述符(FRC 获取请求的要求)?

通常,您在视图控制器加载时启动请求......像您的代码显示那样手动调用插入数据是,好吧,让我们说非常规,

于 2012-05-12T02:02:26.380 回答