【问题标题】:Custom accessor method in Core Data, why using KVO?Core Data 中的自定义访问器方法,为什么要使用 KVO?
【发布时间】:2012-04-26 13:02:51
【问题描述】:

一个典型的自定义访问器方法可以写成如下:

- (NSString *)name
{
    [self willAccessValueForKey:@"name"];
    NSString *myName = [self primitiveName];
    [self didAccessValueForKey:@"name"];
    return myName;
}

- (void)setName:(NSString *)newName
{
    [self willChangeValueForKey:@"name"];
    [self setPrimitiveName:newName];
    [self didChangeValueForKey:@"name"];
}

setPrimitiveName的意思很清楚了。它允许您在没有 KVC 的情况下访问“原始”变量(防止访问器内部的运行循环)并设置传入的值。同样的观察可以应用于 getter。

从文档中可以清楚地看出,setPrimitiveName 禁用更改通知方法:willChangeValueForKey 和对应方法。

现在我的问题是:为什么需要将该方法包装在 willChangeValueForKey:didChangeValueForKey: 方法中?

阅读Core Data编程有这么写:

NSManagedObject 禁用自动键值观察 (KVO) 更改 建模属性和原始访问器的通知 方法不调用访问和更改通知方法。为了 未建模的属性,在 Mac OS X v10.4 Core Data 上也禁用 自动KVO;在 Mac OS X v10.5 及更高版本上,Core Data 采用 NSObject 的行为。

为什么我需要通知我已准备好访问密钥(访问器或实例变量),然后我已经完成了它?谁被告知?

希望我的问题很清楚。提前谢谢你。

【问题讨论】:

    标签: ios core-data key-value-observing accessor kvc


    【解决方案1】:

    您需要它来通知视图,您的值已更改。 例如,您将使用 MKMapView 并在其上添加一些注释,从 Core Data 获取坐标,然后以某种方式更改它的位置。

    如果您的 getter/setter 没有发布这些通知,MKMapView 不会知道位置的这些变化,也不会将其移至新位置。

    您还可以使用这些通知跟踪对象的创建/更改日期。

    我猜,redo/undo 也是由 this 完成的。

    注意

    我想知道,Core Data 是否在后台以某种方式使用这些通知。有人对这个主题有任何想法吗?

    【讨论】:

    • +1 感谢您的支持。是否需要仅通知视图或涉及其他内容?
    • 这是我目前找到的例子,但是,也许还有更有趣的东西)
    • 是的,Core Data 使用它们来知道何时触发故障并填充对象。
    • 谢谢你,马库斯。但它不是也用于 Core Data 中的撤消/重做跟踪吗?(只是我的猜测)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2015-07-05
    相关资源
    最近更新 更多