gpt4 book ai didi

ios - 在属性更改时更新标志

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:15:49 24 4
gpt4 key购买 nike

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

我正在考虑四种方法:

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

以下哪种方法最适合我?也许我遗漏了一些其他想法?

最佳答案

Manually setting the status code

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

Track it using a core data notification [...] Also, won't setting the sync_status itself also fires this notification, leading me into an endless loop?

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

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

Custom setters on the attributes I care about.

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

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

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

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

KVO

应该可以工作,但可能不如自定义 setter 直观。

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

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

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

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

关于ios - 在属性更改时更新标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com