避免 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】:您可以使用RKEntityMapping
的modificationKey
来完成此操作。不过有一些要求:
-
它只适用于单个键。这可能是修改日期、哈希值等。当对象的其余部分发生变化时,总是会发生变化。
您的 JSON 还必须包含此密钥。
如果你有这两个,RestKit 将检查目标对象的 modifyKey 是否与 JSON 匹配。如果不修改就会发生,不会触发KVO。
【讨论】:
谢谢帕特里克,我有 dateModified 当对象发生变化时它会发生变化,而 JSON 中也包含 dateModified,所以两个要求都得到满足,请告诉我如何使它成为 RKEntityMapping 的 modifyKey 来实现我想要的要求 只需将修改键设置为dateModified即可。以上是关于避免 RESTKit 调用的 KVO Obervers的主要内容,如果未能解决你的问题,请参考以下文章