属性更改时更新标志

时间:2013-02-18 23:10:20

标签: ios objective-c cocoa core-data sync

作为同步解决方案的一部分,我对某个类的所有对象使用sync status。每当该对象的特定(非全部)属性发生变化时,我想更新状态。

我正在考虑四种方法:

  1. 无论我在哪里更改,都要在代码中手动设置状态 需要同步的东西。这是最明显的,也是 最费力且容易出错的(我需要记得在添加新功能时也添加同步状态更新)。
  2. 使用核心数据通知跟踪它(例如willSaveNSManagedObjectContextObjectsDidChangeNotification)。乍一看这似乎是最合适的 - 我只需在AppDelegate中注册通知并进行更新 每次的状态。但是有可能检查这些变化 并且只在我关心的属性是时更新同步状态 更新?另外,不会设置 sync_status本身也会触发此通知,导致我进入无限循环?我该如何解决这个问题?
  3. 我关心的属性的自定义setter。我已经有了 试图让这个工作以前的麻烦,并最终决定 尝试单独保留标准核心数据getter / setter。但是我 如果它是最合适的话,我会深入研究。
  4. KVO。我之前没有使用过这种模式,但它可能是最简单的 只需注册我关心的人的属性更改通知 关于并设置那里的旗帜。但是我会在哪里这样做?我需要 监视类的每个对象,所以可以开始观察一个 属性的KVO通知在同一个对象的awakeFromInsert中? 即,无论何时创建对象,立即都具有相同的对象 对象侦听属性A的更改并设置它自己的sync_status 什么时候开火?
  5. 哪种方法最适合我?也许我错过了其他一些想法?

1 个答案:

答案 0 :(得分:2)

  

手动设置状态代码

可能是一个坏主意,正是因为你所描述的原因。你需要在各种情况下这样做。您可能并不总是应用程序的开发人员。有一天,你或其他人会忘记它。即使你不这样做,你也可以在可以集中的地方获得额外的代码。

  

使用核心数据通知跟踪它[...]另外,不会设置sync_status本身也会触发此通知,导致我进入无限循环?

这取决于你是怎么做的。如果您使用辅助NSManagedObjectContextDidSaveNotification,则可以使用NSManagedObjectContext收听。这样,您可以设置同步标记,保存更改并避免循环,因为您要保存在您未观察到的其他上下文中。

使用NSManagedObjectContextObjectsDidChangeNotification也可以。当对象属性发生更改但实际上还没有进行保存时,将发布该文件。检查userInfo字典以查看您关心的任何内容是否已更改,如果是,请设置sync_status标记。设置标志会触发一个新的通知,但它会是你不关心的,所以你打破了循环。使用单独的上下文也会阻止循环。

  

关于我关心的属性的自定义设置器。

绝对可行,但根据您关注的属性数量,您最终可能会获得许多访问者以更新同步状态。在你提到的四个中,这是我将使用的那个。

一种相关但更简单的方法是覆盖托管对象类的willSave。这将在保存之前调用。实施它

  1. 查看[self changedValues]以查找触发同步的属性。
  2. 如果找到任何标志,请设置同步标记。
  3. 这样,无论有多少属性最终触发同步标记,每个实体只有一个自定义方法。

      

    KVO

    应该可行,但可能不像自定义设置器那样直观地工作。

    当我不得不做这样的事情时,我将同步信息放在我的数据存储之外。我会听NSManagedObjectContextDidSaveNotification,在观察者方法中我会:

    1. 查看userInfo以查看更改内容
    2. 获取需要同步的每个对象的NSManagedObjectID
    3. 将对象ID转换为NSStrings,并将其添加到保存在单独文件中的列表中。
    4. 成功同步后,我会清除对象ID列表。

      主要思想是同步标志是比实际模型数据更多的元数据,因此我将其保留在模型之外。如果您希望将其保留在模型中,我会选择覆盖willSave