Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 属性更改时更新标志_Ios_Objective C_Cocoa_Core Data_Sync - Fatal编程技术网

Ios 属性更改时更新标志

Ios 属性更改时更新标志,ios,objective-c,cocoa,core-data,sync,Ios,Objective C,Cocoa,Core Data,Sync,作为同步解决方案的一部分,我对某个类的所有对象使用同步状态。每当该对象的特定(不是所有)属性发生更改时,我都要更新状态 我正在考虑四种方法: 无论我在何处更改,都可以在代码中手动设置状态 需要同步的东西。这是最明显的,也是最重要的 最费力、最容易出错(我需要记住在添加新功能的任何时候都要添加同步状态更新) 使用核心数据通知(例如,willSave或 nsmanagedObjectContextObjectsIDChangeNotification)。乍一看,这似乎是最合适的- 我只需在AppDe

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

我正在考虑四种方法:

  • 无论我在何处更改,都可以在代码中手动设置状态 需要同步的东西。这是最明显的,也是最重要的 最费力、最容易出错(我需要记住在添加新功能的任何时候都要添加同步状态更新)
  • 使用核心数据通知(例如,
    willSave
    nsmanagedObjectContextObjectsIDChangeNotification
    )。乍一看,这似乎是最合适的- 我只需在AppDelegate和update中注册通知 每次都会显示状态。但是有可能检查这些变化吗 并且仅当我关心的属性为 更新?还有,我不会设置
    sync_status
    本身也会触发此通知,让我陷入无休止的循环?我将如何解决这个问题
  • 我关心的属性的自定义设置器。我有 在尝试让它工作之前遇到了麻烦,最终决定 尝试不使用标准的核心数据获取/设置程序。但我 如果它是最合适的,我会重新研究
  • KVO。我以前没有使用过这种模式,但它可能是最容易实现的 只需为我关心的人注册属性更改通知 把旗子放在那儿。但我该在哪里做呢?我需要 要监视类的每个对象,是否可以开始观察 同一对象的
    awakeFromInsert
    中属性的KVO通知? 即,无论何时创建对象,都会立即创建相同的对象 对象侦听对attributeA的更改并设置它自己的
    sync\u状态
    什么时候开火
  • 以下哪种方法最适合我?也许我遗漏了一些其他的想法

    手动设置状态代码

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

    使用核心数据通知对其进行跟踪[…]此外,设置sync_状态本身是否也会触发此通知,使我陷入无休止的循环

    这取决于你怎么做。如果使用辅助
    NSManagedObjectContextDidSaveNotification,则侦听
    NSManagedObjectContext
    可能会起作用。通过这种方式,您可以设置同步标志、保存更改并避免循环,因为您保存的是未观察到的其他上下文

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

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

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

    一种相关但更简单的方法是在托管对象类上重写
    willSave
    。将在保存之前调用该命令。落实到

  • 查看触发同步的属性
  • 如果找到任何同步标志,请设置同步标志
  • 这样,无论有多少属性最终触发同步标志,每个实体只有一个自定义方法

    KVO

    应该是可行的,但可能不如自定义设置器直观地正确工作

    当我不得不这样做时,我把同步信息放在我的数据存储之外。我会监听
    NSManagedObjectContextDidSaveNotification
    ,在observer方法中,我会:

  • 查看
    userInfo
    以查看发生了什么变化
  • 获取需要同步的每个对象的
    NSManagedObjectID
  • 将对象ID转换为NSString,并将其添加到保存在单独文件中的列表中
  • 同步成功后,我会清除对象ID列表


    主要的想法是,sync标志更多的是元数据,而不是实际的模型数据,因此我将其排除在模型之外。如果您希望将其保留在模型中,我会使用覆盖
    willSave

    的方法,另一种方法是使用协议通知接收方任何更改。你可以用字典来传递相关数据吗?谢谢,汤姆。我将考虑你的外部方法。当我想同步多个对象类型时,它似乎是最具可伸缩性的,并且避免了每次我想知道要同步什么时必须过滤整个数据集。您是否也在核心数据中存储了要同步的对象列表?或者其他机制?我把它放在一个属性列表文件中,这对应用程序来说已经足够了。将每个托管对象ID转换为NSString(通过其URI表示),并将其添加到集合中。我需要分别处理插入、更新和删除,因此我使用了一个具有三个键的顶级字典,其中的值是对象ID的数组。您是否必须在NSManagedObjectContextDidSaveNotification中确定哪些属性已更改?我不确定我是否能够做到这一点,因为通知中的userinfo只包含新保存的值。有一次,是的。这是更多的工作。我监听了
    NSManagedObjectContextWillSaveNotification
    ,因为我可以创建第二个托管对象上下文,在其中更改