如果代码将代理人分配给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
}
谓词没有问题,分配谓词,直接使用通知。
答案 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无法检测到消息更改。
就是这样。
如果有人需要就此进行详细讨论,请告诉我。
希望这会对某人有所帮助。