带有谓词的NSFetchedResultsController会忽略来自不同NSManaged

我正在展示使用NSFetchedResultsController谓词的表视图内容:


[NSPredicate predicateWithFormat:@"visible == %@", [NSNumber numberWithBool:YES]]

在使用单独的后台线程时,NSManagedObjectContext我更新了几个实体,并将它们的visible值从更改NO为YES。保存,合并主线程中的更改NSManagedObjectContext。但是NSFetchedResultsControllers fetchedObjects不会改变。控制器也不会调用-controller:didChangeObject:...委托。如果实体以相同的方式在主线程上更新(我的测试应用程序调用了相同的方法),那么一切都会按预期进行。


通知还NSUpdatedObjectsKey包含那些对象。


目前,我发现的唯一解决方案是调用每个NSUpdatedObjectsKey实体:


NSManagedObjectContext *context = ... // main thread context

[context existingObjectWithID:[object objectID] error:nil]

此问题仅与以前与谓词不匹配的更新对象有关。


我是否缺少明显的东西?


呼啦一阵风
浏览 437回答 3
3回答

米琪卡哇伊

事实证明,更新对象NSManagedObjectContext没有主事件触发NSManagedObjectContextObjectsDidChangeNotification,因为故障对象未完成触发。通用修复(或跟踪需要此处理的对象ID):NSManagedObjectContext *context = [self managedObjectContext];for(NSManagedObject *object in [[notification userInfo] objectForKey:NSUpdatedObjectsKey]) {  [[context objectWithID:[object objectID]] willAccessValueForKey:nil];}[context mergeChangesFromContextDidSaveNotification:notification];从NSManagedObject类参考:您可以使用键值nil调用此方法,以确保已引发故障,如以下示例所示。

千万里不及你

从另一个NSManagedObjectContext合并更改后,必须在Background-NSManagedObjectContext上调用processPendingChanges。请参阅《 CoreData编程指南》:请注意,更改通知是通过NSManagedObjectContext的processPendingChanges方法发送的。主线程与应用程序的事件周期绑定在一起,以便在主线程拥有的上下文中的每个用户事件发生后,自动调用processPendingChanges。后台线程不是这种情况-调用方法时取决于平台和发行版,因此您不应依赖特定的时间。如果辅助上下文不在主线程上,则应在适当的时候自己调用processPendingChanges。

30秒到达战场

听起来好像您正在后台线程上进行合并。更改的合并需要在main / UI线程上完成,事件才能正确触发。但是,如果您使用父/子MOC,因为它们在内部处理这些通知,那么这没有什么意义。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS