Objective c 在Cocoa中跟踪模型对象属性更改(脏)

Objective c 在Cocoa中跟踪模型对象属性更改(脏),objective-c,multithreading,cocoa,core-data,Objective C,Multithreading,Cocoa,Core Data,我试图深入了解Cocoa中跟踪模型对象更改的最小开销解决方案 在我看来,有3种选择: 使用核心数据–存在大量用于监视模型对象更改()的功能。我不知道与其他方法相比,核心数据管理基础架构的开销有多大,但它完善的多线程支持体系结构是一个优势。对于跨平台开发人员来说,没有一个易于访问的模式有一些缺点,但是有一些方法可以解决这个问题 编写自定义访问器,在使用新值更新字段时将对象标记为脏。我已经用了很长一段时间了,这项技术的成功率参差不齐。在跨线程共享对象时,需要处理一些棘手的问题。您也无法从属性自动合成

我试图深入了解Cocoa中跟踪模型对象更改的最小开销解决方案

在我看来,有3种选择:

  • 使用核心数据–存在大量用于监视模型对象更改()的功能。我不知道与其他方法相比,核心数据管理基础架构的开销有多大,但它完善的多线程支持体系结构是一个优势。对于跨平台开发人员来说,没有一个易于访问的模式有一些缺点,但是有一些方法可以解决这个问题

  • 编写自定义访问器,在使用新值更新字段时将对象标记为脏。我已经用了很长一段时间了,这项技术的成功率参差不齐。在跨线程共享对象时,需要处理一些棘手的问题。您也无法从属性自动合成等功能的增强中获得好处。但是,与使用核心数据相比,您可以更有效地控制数据存储,这可能会带来好处(例如,某些操作可以在SQL存储中以更高效的方式跨多个对象完成)。注意:这里可能有很多变化,这取决于您如何编写访问器。为了进行对话,让我们假设setter根据旧值检查新值,对KVO(willChange/didChange)进行适当的调用,并设置一个布尔标志(当然都在同步范围内)

  • 使用KVO监视对象字段(ala KeyPathsForvaluesFectingValueForkey:),并在KVO调用中将对象标记为脏对象。我还没有使用这种方法,但它似乎是一种体面的方法。明显的缺点是每次调用setter时都会调用callout

  • 我倾向于认为选项2的开销最低(就原始处理需求而言),因为核心数据和KVO在生成的访问器或KVO调用中都有一些额外的开销。问题是,开销有多大

    最后,我是否错过了一个选择


    谢谢。

    在我看来,核心数据的
    NSManagedObjectContext
    使跟踪对
    NSManagedObject
    的更改变得非常简单。没错,但问题是与其他方法相比,这种“简单性”的开销有多大。