Core data NSFetchedResultsController错过合并的NSManagedObjectContext上的更新

Core data NSFetchedResultsController错过合并的NSManagedObjectContext上的更新,core-data,merge,nsfetchedresultscontroller,nsmanagedobjectcontext,Core Data,Merge,Nsfetchedresultscontroller,Nsmanagedobjectcontext,我有两个托管对象上下文A和B。这两个上下文在保存时通过将更改从一个合并到另一个来保持同步(通过监视NSManagedObjectContextDidSaveNotification)。我已验证对A和B的更改是否正确合并 我有一个NSFetchedResultsController监控对B的更新。我发现对A的某些更新不会导致在B上触发nsfrc。当使用nsfrc正在查找的属性(在B上)创建新的托管对象并将其添加到A时,nsfrc会在B合并A保存的更改后触发。但是,如果A(和B)上已经存在托管对象,

我有两个托管对象上下文A和B。这两个上下文在保存时通过将更改从一个合并到另一个来保持同步(通过监视
NSManagedObjectContextDidSaveNotification
)。我已验证对A和B的更改是否正确合并

我有一个
NSFetchedResultsController
监控对B的更新。我发现对A的某些更新不会导致在B上触发nsfrc。当使用nsfrc正在查找的属性(在B上)创建新的托管对象并将其添加到A时,nsfrc会在B合并A保存的更改后触发。但是,如果A(和B)上已经存在托管对象,并且我修改了该对象并保存了A,而我可以看到B正在合并A的保存通知中的更改,则nsfrc监控B不会触发


我错过了什么

我遇到了这个问题,看来我已经解决了。我不知道我到底做了什么。我的意思是,我做了几件事,但不知道哪一件成为了解决方案。所以我将简单地描述

我对代码进行了重构,以遵循官方文档和一些论坛中的一些“提示”:

  • 如果您在另一个线程中管理
    NSManagedObjectContext
    ,则应该在该线程中创建它,而不是以某种方式传递给该线程
  • 您应该只在主线程中添加观察者(以获取合并的保存通知),这样它们也将在主线程中合并
  • (可选,但我做到了)您可以尝试在主线程中保存上下文,即使它是在后台线程中创建和管理的

  • 1和3看起来更像一些“魔法”,所以我认为你应该先尝试跟随2。希望这能对您有所帮助。

    不确定这是否能解决您的问题,但在合并A中的更改后,尝试在上下文B上调用
    processPendingChanges


    此外,您的nsfrc是否使用缓存?尝试禁用缓存,看看它对您的情况是否有任何影响…

    让我澄清一下,NSFetchedResultsController正在搜索的谓词是一个简单的布尔属性“marked==YES”。如果nsfrc正在监视托管对象上下文,它将始终触发这些更新。如果它在监视B,它只看到添加到A的对象,而不是在A中修改的对象。谓词是针对
    B
    实体还是
    A
    实体运行的?看看我的“解决方案”(如果可以这样称呼的话)-我的
    NSFetchedResultsController
    使用缓存,现在没有问题了。所以问题肯定不在缓存中。我已经重构了我的代码,虽然这不是完整的答案,但线程问题似乎是根本原因。