NSFetchedResultsController委托未调用API侦听器

时间:2013-06-17 15:23:14

标签: ios core-data delegation nsfetchedresultscontroller

如果代码将代理人分配给NSFetchedResultsController,如下所示:

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

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
}

谓词没有问题,分配谓词,直接使用通知。

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

我有一个带有委托集和执行了performFetch的NSFetchedResultsController。 仍然没有调用委托方法。

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

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

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

所以,我确保我永远不会将nils放在用作 sectionNameKeyPath 的属性中。

答案 2 :(得分:0)

我遇到过同样的问题,我正在分享经验。 也许它可以帮助别人。

我确实有“Message”NSManagedObject类。

如果我们确实有以下属性:

@NSManaged public var buddyId: Int32
@NSManaged public var message: NSObject?
@NSManaged public var messageServerId: Int32
@NSManaged public var messageUnixTime: Double
@NSManaged public var sender: Int32
@NSManaged public var status: Int32
@NSManaged public var type: Int32
@NSManaged public var userId: Int32
@NSManaged public var buddyName: String?
@NSManaged public var chatroomId: Int32
@NSManaged public var messageSource: Int32

你的谓词就像:

fetchRequest.predicate = NSPredicate(format: "userId == %@ AND buddyId == %@ AND messageSource == %d", userId, buddyId, 10)

所以在这种情况下,我们将userId作为Int32,但我们将它作为字符串传递给谓词。 NSFetchedResultsController在mainContext上,所有消息(数据)处理都发生在privateConext(mainContext的子上下文)上。

所以NSFetchedResultsController将在performFetch()调用上获取所有消息,但是当我们在privateContext上对消息执行任何插入/更新/删除操作时,这些操作效果将不会反映NSFetchedResultsController。

原因很简单,因为我没有提供正确的谓词。

我需要修改谓词,如:

fetchRequest.predicate = NSPredicate(format: "userId == '%@' AND buddyId == '%@' AND messageSource == %d", userId, buddyId, 10)

或者我需要提供如下的谓词:

fetchRequest.predicate = NSPredicate(format: "userId == %d AND buddyId == %d AND messageSource == %d", userId, buddyId, 10)

原因是“userId”和“buddyId”是Int32类型,但我在谓词中将它们作为String提供。因此,NSFetchedResultsController无法检测到消息更改。

就是这样。

如果有人需要就此进行详细讨论,请告诉我。

希望这会对某人有所帮助。