作为同步解决方案的一部分,我对某个类的所有对象使用sync status
。每当该对象的特定(非全部)属性发生变化时,我想更新状态。
我正在考虑四种方法:
willSave
或
NSManagedObjectContextObjectsDidChangeNotification
)。乍一看这似乎是最合适的 -
我只需在AppDelegate中注册通知并进行更新
每次的状态。但是有可能检查这些变化
并且只在我关心的属性是时更新同步状态
更新?另外,不会设置
sync_status
本身也会触发此通知,导致我进入无限循环?我该如何解决这个问题?awakeFromInsert
中?
即,无论何时创建对象,立即都具有相同的对象
对象侦听属性A的更改并设置它自己的sync_status
什么时候开火?哪种方法最适合我?也许我错过了其他一些想法?
答案 0 :(得分:2)
手动设置状态代码
可能是一个坏主意,正是因为你所描述的原因。你需要在各种情况下这样做。您可能并不总是应用程序的开发人员。有一天,你或其他人会忘记它。即使你不这样做,你也可以在可以集中的地方获得额外的代码。
使用核心数据通知跟踪它[...]另外,不会设置sync_status本身也会触发此通知,导致我进入无限循环?
这取决于你是怎么做的。如果您使用辅助NSManagedObjectContextDidSaveNotification
,则可以使用NSManagedObjectContext
收听。这样,您可以设置同步标记,保存更改并避免循环,因为您要保存在您未观察到的其他上下文中。
使用NSManagedObjectContextObjectsDidChangeNotification
也可以。当对象属性发生更改但实际上还没有进行保存时,将发布该文件。检查userInfo
字典以查看您关心的任何内容是否已更改,如果是,请设置sync_status
标记。设置标志会触发一个新的通知,但它会是你不关心的,所以你打破了循环。使用单独的上下文也会阻止循环。
关于我关心的属性的自定义设置器。
绝对可行,但根据您关注的属性数量,您最终可能会获得许多访问者以更新同步状态。在你提到的四个中,这是我将使用的那个。
一种相关但更简单的方法是覆盖托管对象类的willSave
。这将在保存之前调用。实施它
[self changedValues]
以查找触发同步的属性。这样,无论有多少属性最终触发同步标记,每个实体只有一个自定义方法。
KVO
应该可行,但可能不像自定义设置器那样直观地工作。
当我不得不做这样的事情时,我将同步信息放在我的数据存储之外。我会听NSManagedObjectContextDidSaveNotification
,在观察者方法中我会:
userInfo
以查看更改内容NSManagedObjectID
成功同步后,我会清除对象ID列表。
主要思想是同步标志是比实际模型数据更多的元数据,因此我将其保留在模型之外。如果您希望将其保留在模型中,我会选择覆盖willSave
。