代码之家  ›  专栏  ›  技术社区  ›  Costique

nsmanagedObject和kvo vs文档

  •  20
  • Costique  · 技术社区  · 14 年前

    我有一个习俗 NSManagedObject 子类,比如说 Person . 我也有一个 UIView 注册与 -addObserver:forKeyPath:options:context: 观察 其中一些是像“name”一样持久的,而另一些则是与核心数据无关的哑kvo兼容的访问器,比如“drinking”。

    @interface Person : NSManagedObject
    {
        BOOL drinking;
    }
    @property (nonatomic, retain) NSString* name;
    @property (nonatomic, readonly) BOOL drinking;
    @end
    
    @implementation Person
    @dynamic name;
    ...
    - (void) getDrunk {
        [self willChangeValueForKey: @"drinking"];
        drinking = YES;
        [self didChangeValueForKey: @"drinking"];
    }
    ...
    @end
    

    一切正常。每当我发 -getDrunk 或设置 name 属性,该视图不会收到通知。我是一个快乐的人,除非当我读到 被管理对象 文件说明:

    + (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
    

    事实1。是的,如果接收器自动支持观察密钥更改通知的密钥值,则为否。

    事实2。nsmanagedObject的默认实现对于建模的属性返回no,对于未删除的属性返回yes。

    现在,我正努力从文档中分析上述两个事实。检查事实2很容易,班上的人确实会为@“name”返回“no”,为@“driving”返回“yes”。但是,当名称更改时,如何通知视图?科沃医生清楚地说,

    使用自动观察者通知,当通过键值编码和键值编码兼容方法改变属性时,不需要将更改括在调用willChangeValueForkey:和didChangeValueForkey:的属性中。

    所以,如果有人拒绝 +automaticallyNotifiesObserversForKey: 对于@“name”,似乎我必须手动包装name setter will/didChangeValueForKey: 让kvo工作。但是,kvo有效 只是罚款 . 我错过了什么?有什么意义 被管理对象 压倒一切 +市场自动通知服务器: 如果没有改变标准的kvo行为,记录它?

    请帮助我恢复理智。

    1 回复  |  直到 13 年前
        1
  •  18
  •   Alex    14 年前

    NSManagedObject name - name - setName: willChangeValueForKey: didChangeValueForKey: