0

我这里有一个奇怪的问题。我没有在我的 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;
}

但我无法为自己的一生弄清楚如何解决这个问题?因为这是故意的?

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

谢谢,拉吉帕万

4

1 回答 1

0

我有 1 个错误,还有 1 个错误(无知),我不知道,因此我遇到了这个问题:

错误:
尽管论坛上进行了很多讨论,但我错误地陈述了我列出的第二项:

  • 只有一个托管对象上下文
    发生了这些修改。

我错误地登录并发现我处于相同的上下文中!我太傻了!

无知:
我对 RK 代码进行了一些挖掘,认为那里发生了一些可疑的事情,检查了 Blake Watters 的评论和他的提交 4b394f8c1e1f 以查看现在删除的早期代码(调用 -processPendingChanges)是否导致任何问题而不是让代表了解更新。

发现这确实在一个单独的线程上,是的,它有自己的 MOC,我错过了。接下来要做的事情很简单,我实现了将 MOC 的更改从不同线程合并到主 MOC的机制。但这也不起作用!

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

于 2012-11-20T14:44:33.883 回答