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)
但是,当我观察的关键路径发生变化时,如何触发方法?
还有一个额外的问题,当我将自己添加为观察者时,我希望关键路径成为我的核心数据模型中的属性,我是否已正确完成?
覆盖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)
有关详细信息,请参阅" 接收更改通知 ".
我建议你看一下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指针的正确方法以避免与超级/子类冲突等.
| 归档时间: |
|
| 查看次数: |
2253 次 |
| 最近记录: |