Restkit + Coredata - NSFetchedResultsControllerDelegate回调未单独触发UPDATE操作

时间:2012-11-19 16:14:21

标签: iphone ios cocoa-touch core-data restkit

我这里有一个奇怪的问题。我没有在NSManagedObject上获得“更新”操作的回调,但是在该实体类型的集合中插入或删除的任何对象将触发委托回调。

在我继续进一步讨论之前,我想告知我的设置:

  • 正确配置了NSFetchedResultsController。确保这一点    在外部进行修改的财产不是任何一种    根据Apple的要求对fetchedResultsController进行排序    文档:

      

    当对象的状态发生变化时会报告更新,但会更改   属性不是排序键的一部分。

  • 只有一个托管对象上下文正在进行这些修改。

  • 由于正在报告插入和删除操作    代表,我认为更新有些可疑    操作

我在RKLogs的帮助下深入挖掘了Restkit代码,以查看映射的确切位置以及更新coredata对象的位置,以找出未获得更新委托回调的原因。

在班级RKManagedObjectMappingOperation -performMapping方法中,Blake Watters先生记录了更新时未触发MOC回调的原因:

- (BOOL)performMapping:(NSError **)error
{
    BOOL success = [super performMapping:error];
    if ([self.objectMapping isKindOfClass:[RKManagedObjectMapping class]]) {
        /**
         NOTE: Processing the pending changes here ensures that the managed object context generates observable
         callbacks that are important for maintaining any sort of cache that is consistent within a single
         object mapping operation. As the MOC is only saved when the aggregate operation is processed, we must
         manually invoke processPendingChanges to prevent recreating objects with the same primary key.
         See https://github.com/RestKit/RestKit/issues/661
         */
        [self connectRelationships];
    }
    return success;
}

但我不能为自己的生活弄清楚如何解决这个问题?是因为它有目的地完成了吗?

有没有人遇到同样的问题?我该如何解决?

谢谢, Raj Pawan

1 个答案:

答案 0 :(得分:0)

我有一个错误和另外一件事(无知),我不知道,因此我遇到了这个问题:

<强>错误:
尽管在论坛上进行了很多讨论,但我说错了第二个列出的项目:

  •   

    这些只有一个托管对象上下文   正在进行修改。

我错误地记录并发现我在同一个环境中!我这么傻!

<强>无知:
我做了一些挖掘RK代码的想法,认为那里有一些可疑的东西,检查了Blake Watters的评论和他的提交4b394f8c1e1f以查看现在删除的早期代码(调用-processPendingChanges)是否导致任何问题并且不让它代表被告知有关更新。

发现这确实是在一个单独的线程上,是的,它有自己的MOC,我错过了。接下来要做的很简单,我将机制实现到merge changes of a MOC from different thread into main MOC。但这也不起作用!

原因是我处于应用程序开发的最初阶段。我只是使用RestKit映射json响应和coredata对象,我无处利用它!我只是在GDB中记录coredata对象,它们始终处于故障状态!我依靠-objectLoader回调和NSNotification object来确定确实存在更新。在测试的某个时刻,我碰巧记录了托管对象的一个​​属性,该属性在Notification回调中被更改,然后又被合并回主MOC。这会导致托管对象出错并加载托管对象的所有属性。现在,当辅助线程MOC更改与主线程MOC合并时,我的NSFetchedResultsControllerDelegate回调开始触发。