3

如果代码将委托分配给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
}

谓词没有问题,分配了一个谓词,并且直接使用通知工作。

4

3 回答 3

11

问题是从不调用初始值,- (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;
}
于 2013-06-17T15:26:19.457 回答
5

我有NSFetchedResultsController一个委托集并performFetch执行。并且仍然没有调用委托方法。

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

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

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

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

于 2014-11-05T16:49:52.167 回答
1

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

我确实有“消息”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 类型,但我在谓词中将它们作为字符串提供。因此 NSFetchedResultsController 无法检测到消息更改。

就是这样。

让我知道是否有人需要对此进行详细讨论。

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

于 2017-11-27T07:55:13.837 回答