Restkit + Coredata - NSFetchedResultsControllerDelegate 回调不会单独为更新操作触发
Posted
技术标签:
【中文标题】Restkit + Coredata - NSFetchedResultsControllerDelegate 回调不会单独为更新操作触发【英文标题】:Restkit + Coredata - NSFetchedResultsControllerDelegate callbacks not triggered for UPDATE operations alone 【发布时间】:2012-11-19 16:14:20 【问题描述】:我有一个奇怪的问题。我没有在我的 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;
但我终其一生都无法弄清楚如何解决这个问题?因为这是故意的?
有人遇到过同样的问题吗?我该如何解决?
谢谢, 拉吉帕万
【问题讨论】:
【参考方案1】:我有 1 个错误,还有 1 个我不知道的错误(无知),因此我遇到了这个问题:
错误: 尽管论坛上进行了很多讨论,但我错误地陈述了我列出的第二项:
只有一个托管对象上下文,这些 正在进行修改。
我错误地登录并发现我处于相同的上下文中!真傻啊!
无知: 我对 RK 代码进行了一些挖掘,认为那里发生了一些可疑的事情,检查了 Blake Watters 的 cmets 和他的提交 4b394f8c1e1f 以查看现在已删除的较早代码(调用 -processPendingChanges)是否导致任何问题并且不让代表了解更新。
发现这确实是在一个单独的线程上,是的,它有自己的 MOC,我错过了。接下来要做的很简单,我实现了merge changes of a MOC from different thread into main MOC的机制。但这也不起作用!
原因是我正处于应用程序开发的初级阶段。我只是使用 RestKit 将 json 响应与 coredata 对象映射,我无处使用它!我只是在 GDB 中记录 coredata 对象,它们始终处于 故障状态!我依靠-objectLoader
回调和NSNotification object
来查看确实有可用的更新。在测试的某个时刻,我碰巧记录了托管对象的一个属性,该属性在通知回调中发生了更改,然后才合并回主 MOC。这会使托管对象出错并加载托管对象的所有属性。现在,当辅助线程 MOC 更改与主线程 MOC 合并时,我的 NSFetchedResultsControllerDelegate 回调开始触发。
【讨论】:
以上是关于Restkit + Coredata - NSFetchedResultsControllerDelegate 回调不会单独为更新操作触发的主要内容,如果未能解决你的问题,请参考以下文章
RestKit + CoreData,理解 RKManagedObjectRequestOperation