无论类型如何,我如何/应该为所有实体和键注册 KVO 观察者?
这样做的目的是监视对象的更改并将它们标记为已修改,以便我可以通过 JSON API 和 Web 服务提供同步功能。
另外,如果我做错了,正确的方法是什么?
编辑:并不是说这将用于生产代码,我宁愿不冒险使用不成熟的库。
无论类型如何,我如何/应该为所有实体和键注册 KVO 观察者?
这样做的目的是监视对象的更改并将它们标记为已修改,以便我可以通过 JSON API 和 Web 服务提供同步功能。
另外,如果我做错了,正确的方法是什么?
编辑:并不是说这将用于生产代码,我宁愿不冒险使用不成熟的库。
NSManagedObjectContextObjectsDidChangeNotification
是你的朋友。
此通知在每次运行循环迭代时发布一次,并包含所有已更改/插入/删除/合并的字典。
需要注意两点:
如果您正在使用花哨的线程/操作队列技巧,则在某些情况下,如果此通知似乎没有在您期望的时候发布,您可能必须手动调用 processPendingChanges。通常,CD 在需要时会自动将其安排在当前运行循环中。
当您注册此通知时,请具体说明您想从哪个托管对象上下文(不要只传递 nil)。内部框架私下使用 Core Data,并且此通知可能会由您不期望的上下文发布。
我会看看 RestKit,特别是 RKObjectMapper 和 RKObjectManager 类,因为它允许 KVC 对象映射。
RKObjectManager* manager = [RKObjectManager managerWithBaseURL:myBaseURL];
RKObjectMapping* articleMapping = [RKObjectMapping mappingForClass:[Article class]];
[mapping mapAttributes:@"title", @"body", @"publishedAt", nil];
[manager.mappingProvider setObjectMapping:articleMapping forKeyPath:@"article"];
// Generate an inverse mapping for transforming Article -> NSMutableDictionary.
[manager.mappingProvider setSerializationMapping:[articleMapping inverseMapping] forClass:[Article class]];`