为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

iOS
呼啦一阵风 2019-11-13 15:54:47
我正在展示使用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]此问题仅与以前与谓词不匹配的更新对象有关。我是否缺少明显的东西?
查看完整描述

3 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

事实证明,更新对象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调用此方法,以确保已引发故障,如以下示例所示。


查看完整回答
反对 回复 2019-11-13
?
千万里不及你

TA贡献1784条经验 获得超9个赞

从另一个NSManagedObjectContext合并更改后,必须在Background-NSManagedObjectContext上调用processPendingChanges。


请参阅《 CoreData编程指南》:


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


查看完整回答
反对 回复 2019-11-13
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 435 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信