NSFetchedResultsController委托未调用API侦听器

Jos*_*des 2 core-data delegation nsfetchedresultscontroller ios

如果代码将委托分配给NSFetchedResultsController如下:

-(id)initWithFetchedResultsController:(NSFetchedResultsController*)fetchedResultsController
{
    self = [super init];
    if (self != nil)
    {
        fetchedResultsController.delegate = self;
        _fetchedResultController = fetchedResultsController;
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

NSFetchedResultsControllerDelegate方法– controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:从未被调用过self:

-(void)controller:(NSFetchedResultsController *)controller
  didChangeObject:(id)anObject
      atIndexPath:(NSIndexPath *)indexPath
    forChangeType:(NSFetchedResultsChangeType)type
     newIndexPath:(NSIndexPath *)newIndexPath
{
    NSLog(@"Delegate method called"); // Never called
}
Run Code Online (Sandbox Code Playgroud)

谓词没有问题,谓词被分配,并且使用通知直接起作用.

Jos*_*des 8

问题是- (BOOL)performFetch:(NSError **)error永远不会调用initial,因为这个特定的代码只关心结果集的更改,而不是初始集.但是,控制器不会注意到它从未有过的数据变化.更改init方法如下修复了问题:

-(id)initWithFetchedResultsController:(NSFetchedResultsController*)fetchedResultsController
{
    self = [super init];
    if (self != nil)
    {
        fetchedResultsController.delegate = self;
        _fetchedResultController = fetchedResultsController;
        [fetchedResultsController performFetch:nil];
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)


anc*_*jic 5

我有一个NSFetchedResultsController,它有一个委托集和performFetch执行.仍然没有调用委托方法.

我的Fetched Results Controller有一个sectionNameKeyPath,它是一个布尔值.我作为一个非原始的访问 - 作为NSNumber.

我插入和更新的所有实体都具有此属性为零.我原以为nil会被解释为NO,但事实并非如此.

当我插入一个具有此属性为nil的实体时,将不会调用获取结果控制器委托方法.它会简单地忽略这个记录,就像它不关心我的FRC一样.

所以,我确信我从来没有把尼尔斯在用作财产sectionNameKeyPath.