2

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

我正在考虑四种方法:

  1. 在我更改需要同步的内容时手动设置代码中的状态。这是最明显的,但也是最费力和最容易出错的(我需要记住,在添加新功能时还要添加同步状态更新)。
  2. 使用核心数据通知(例如willSaveNSManagedObjectContextObjectsDidChangeNotification)跟踪它。乍一看,这似乎是最合适的——我只需在我的 AppDelegate 中注册通知并每次更新状态。但是是否可以检查更改并仅在我关心的属性更新时才更新同步状态?另外,设置本身不会sync_status触发此通知,导致我陷入无限循环吗?我将如何解决这个问题?
  3. 我关心的属性的自定义设置器。我之前在尝试让它工作时遇到了麻烦,最终决定尝试不理会标准的核心数据获取器/设置器。但如果它是最合适的,我会深入研究。
  4. KVO。我以前没有使用过这种模式,但最简单的方法可能是为我关心的人注册属性更改通知并在那里设置标志。但是我会在哪里做呢?我需要监视该类的每个对象,那么是否可以开始在同一个对象中观察属性的 KVO 通知awakeFromInsert?即,每当创建一个对象时,立即让同一个对象监听attributeA 的更改并sync_status 在它触发时将其设置为自己的?

这些方法中哪一种最适合我?也许我错过了其他一些想法?

4

1 回答 1

2

手动设置状态码

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

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

这取决于你怎么做。NSManagedObjectContextDidSaveNotification如果您使用辅助设备,侦听可能会起作用NSManagedObjectContext。这样,您可以设置同步标志、保存更改并避免循环,因为您正在保存在您未观察到的不同上下文中。

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

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

绝对可行,尽管取决于您关心的属性数量,您最终可能会使用很多访问器来更新同步状态。在你提到的四个中,这是我会使用的一个。

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

  1. 查看[self changedValues]触发同步的属性。
  2. 如果您找到其中任何一个,请设置同步标志。

这样,每个实体只有一个自定义方法,无论有多少属性最终触发同步标志。

KVO

应该可以工作,但可能不如自定义设置器那么直观。

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

  1. 仔细userInfo查看发生了什么变化
  2. 获取NSManagedObjectID需要同步的每个对象
  3. 将对象 ID 转换为 NSStrings 并将它们添加到保存在单独文件中的列表中。

成功同步后,我会清除对象 ID 列表。

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

于 2013-02-19T00:31:09.043 回答