2013-02-18 190 views
2

作为我的同步解决方案的一部分,我对某个类的所有对象使用sync status。只要该对象的特定(不是全部)属性发生更改,我想更新状态。属性更改时更新标志

我正在考虑四种方法:手动设置代码中的地位,无论我改变 一些需要同步

  1. 。这是最明显的,但也是最费力和容易出错的(我需要记得在添加新功能时添加同步状态更新)。
  2. 使用核心数据通知(例如willSaveNSManagedObjectContextObjectsDidChangeNotification)对其进行跟踪。这似乎是乍一看最合适 - 我只需在我的AppDelegate中注册通知,并且每次更新 状态。但是有可能检查 的更改,并且只有在我关心的属性更新为 时才更新同步状态?另外,不会设置 sync_status本身也会触发这个通知,导致我陷入无限循环?我将如何解决这个问题?
  3. 关于我关心的属性的自定义setter。我有 麻烦试图让这个工作之前,并最终决定 试图离开标准的核心数据获取/设置单独。但如果它是最合适的,我会回到这个问题。
  4. KVO。我之前没有使用过这种模式,但它可能是最简单的 只需注册属于我的 有关的属性更改通知并在那里设置标志。但我会在哪里做这个?我需要 来监视班级的每个对象,那么是否有可能开始在同一对象的awakeFromInsert中观察属性的KVO通知的 ? 也就是说,无论何时创建一个对象,立即就有相同的对象侦听属性A的更改并在其触发时设置它自己的sync_status

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

+0

另一种方法是通知接收方有任何变化的协议。你可以用字典来传输相关数据? – katzenhut 2013-02-18 23:16:00

回答

2

手动设置状态代码

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

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

这取决于你是如何做到的。如果您使用辅助NSManagedObjectContext,则倾听NSManagedObjectContextDidSaveNotification可能会有效。通过这种方式,您可以设置同步标志,保存更改并避免循环,因为您将保存在您未观察到的不同上下文中。

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

关于我关心的属性的自定义setter。

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

一个相关但更简单的方法是覆盖您的托管对象类上的willSave。这将在保存之前被调用。实现它到

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

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

志愿

应该工作,但可能不太直观,以获得比定制的制定者权工作。

当我不得不做这样的事情时,我把同步信息放在我的数据存储之外。我听NSManagedObjectContextDidSaveNotification,并在观测方法,我想:

  1. 去翻userInfo,看看有什么改变了
  2. 获取NSManagedObjectID每个对象,将需要同步
  3. 转换对象ID到NSStrings并将其添加到保存在单独文件中的列表中。

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

这个想法主要是因为同步标志比实际模型数据更多的元数据,所以我将它保留在模型之外。如果你喜欢把它保留在模型中,我会重写willSave

+0

谢谢,汤姆。我将考虑你的外部方法。当我想要同步多个对象类型时,它似乎是最具可伸缩性的,并且每次我想知道要同步的内容时都不必过滤整个数据集。您是否还存储了要在核心数据中同步的对象列表?还是其他一些机制? – 2013-02-19 00:38:34

+0

我把它放在一个属性列表文件中,这对应用程序来说已经足够了。将每个托管对象ID转换为NSString(通过其URIRepresentation)并将其添加到集合中。我需要分别处理插入,更新和删除操作,所以我使用了带有三个键的顶级词典,其中的值是对象ID的数组。 – 2013-02-19 01:15:16

+0

您是否曾经在NSManagedObjectContextDidSaveNotification *中确定哪些属性发生了变化?由于通知中的用户信息仅包含新保存的值,因此我不确定我能做到这一点。 – 2013-02-19 03:40:08