帮助进行关键值观察

Jos*_*hua 2 cocoa core-data objective-c key-value-observing cocoa-bindings

我需要KVO的一些帮助,我差不多在那里.我想要做的是在树控制器中的某些内容发生变化时触发一个方法.

所以我使用这段代码注册为KVO.

[theObject addObserver: self
            forKeyPath: @"myKeyPath"
               options: NSKeyValueObservingOptionNew
               context: NULL];
Run Code Online (Sandbox Code Playgroud)

但是,当我观察的关键路径发生变化时,如何触发方法?

还有一个额外的问题,当我将自己添加为观察者时,我希望关键路径成为我的核心数据模型中的属性,我是否已正确完成?

out*_*tis 6

覆盖observeValueForKeyPath:ofObject:change:context:以调度您要调用的方法.

@interface Foo : NSObject {
    NSDictionary *dispatch;
    ...
}
@end
@implementation Foo
-(id)init {
    if (self = [super init]) {
        dispatch = [[NSDictionary dictionaryWithObjectsAndKeys:NSStringFromSelector(@selector(somethingHappenedTo:with:)),@"myKeyPath",...,nil] retain];
        ...
    }
}
...
- (void)observeValueForKeyPath:(NSString *)keyPath
            ofObject:(id)object
            change:(NSDictionary *)change
            context:(void *)context
{
    SEL msg = NSSelectorFromString([dispatch objectForKey:keyPath]);
    if (msg) {
        [self performSelector:msg withObject:object withObject:keyPath];
    }
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
...
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅" 接收更改通知 ".


Bar*_*ark 5

我建议你看一下Google Toolbox For Mac的GTMNSObject + KeyValueObserving.h类别,或者至少是Michael Ash 的博客文章,它启发了它.基本上,手动KVO权利非常微妙,API建议的模式并不理想.在API上放置一个其他层(如GTMNSObject + KeyValueObserving)会更好,这会使事情更像NSNotificationAPI,并隐藏一些微妙的错误来源.

使用GTMNSObject + KeyValueObserving,你会这样做

[theObject gtm_addObserver:self
                forKeyPath:@"myKeyPath"
                  selector:@selector(myCallbackSelector:)
                  userInfo:nil
                   options:NSKeyValueObservingOptionNew];
Run Code Online (Sandbox Code Playgroud)

-myCallbackSelector:@"myKeyPath"使用类型参数更改值时,将调用您的函数GTMKeyValueChangeNotification,该参数将封装您可能需要的所有相关信息.

这样,你不必拥有一个大的调度表observeValueForKeyPath:ofObject:change:context(实际上一个是由类别维护的)或者必须担心使用context指针的正确方法以避免与超级/子类冲突等.