避免 RESTKit 调用的 KVO Obervers

Posted

技术标签:

【中文标题】避免 RESTKit 调用的 KVO Obervers【英文标题】:Avoiding KVO Obervers for RESTKit calls 【发布时间】:2015-02-24 17:03:18 【问题描述】:

我正在尝试使用 KVO 观察者实现 dateModified 更新,如下所示

https://github.com/dvidsilva/everpobre/blob/master/coreData/DVDNoteModel.m

但问题是,当 RESTKit 从服务器获取数据并将其本地存储在 CoreData 中时,它也会被调用,这是我不想要的。

我需要避免仅为 RESTKit 调用触发 KVO 观察者,因此当 RESTKit 从服务器获取数据时,它一定不能使用 dataModified 进行更新。

此外,我发现 RESTKit 调用是从 [RKResponseMapperOperation main] 发起的,因此使用 [NSThread callStackSymbols] 虽然我能够成功跟踪并执行它,但此解决方案仅适用于 Build 版本(安装在设备上)但是对于发布版本 [NSThread callStackSymbols] 没有返回相同的符号,导致 RESTKit 调用未被跟踪。

我无法跟踪当前调用是 RESTKit 还是我自己的。

Is there a way to track if current Thread call is from RESTKit?
or 
Is there a way we could track it using RESTKit NSManagedObjectContext or so?
or any other possible solution?

如果您有任何可能的提示,请回答。

谢谢。

【问题讨论】:

在 ManagedObjectContext save: 方法上使用 lldb 和符号断点,以及您的方法调用并尝试找出答案。 我尝试使用 [NSThread callStackSymbols] 和跟踪 [RKResponseMapperOperation main] 进行此操作,但这不适用于发布版本。任何建议 你的终极目标是什么?但是,您进行更改时,它们将始终向上传播到上下文层次结构并导致更改通知,这是 Core Data 工作方式的基础。一旦您离开后台上下文保存 RestKit,您就无法判断合并的来源。如果它来自后台线程,您可能会在合并期间获得将/已保存通知并禁用您的侦听器... Wain,我实际上在等待你的输入,我的目标很简单,我想在我的每个 NSManagedObjects (使用 KVO Observers 左右)发生变化时继续修改“dateModified”,除了对于 RESTKit。一旦 RESTKit 为 RKEntityMapping 对象加载数据,它创建 NSManagedObjects 以持久保存在 coredata 中,同时执行 coredata 操作 RESTKit 将覆盖 KVO Observers 中的“dateModified”,用于来自服务器的所有 NSManagedObjects,这是我不想要的,必须有一些合适的解决方案识别 RESTKit 调用以避免该特定调用的 KVO 观察者。 【参考方案1】:

您可以使用RKEntityMappingmodificationKey 来完成此操作。不过有一些要求:

    它只适用于单个键。这可能是修改日期、哈希值等。当对象的其余部分发生变化时,总是会发生变化。 您的 JSON 还必须包含此密钥。

如果你有这两个,RestKit 将检查目标对象的 modifyKey 是否与 JSON 匹配。如果不修改就会发生,不会触发KVO。

【讨论】:

谢谢帕特里克,我有 dateModified 当对象发生变化时它会发生变化,而 JSON 中也包含 dateModified,所以两个要求都得到满足,请告诉我如何使它成为 RKEntityMapping 的 modifyKey 来实现我想要的要求 只需将修改键设置为dateModified即可。

以上是关于避免 RESTKit 调用的 KVO Obervers的主要内容,如果未能解决你的问题,请参考以下文章

避免在 Restkit 路由器上进行 uri 编码

Apple官文中的KVO 与 FBKVOController

通过子类实现KVO,浅析KVO底层原理

iOS 单元测试:测试是不是调用了一个 KVO 观察者

KVO

Objective-C 变量...指向它自己?