Kam*_*rev 5 properties objective-c ios
我的课程中有几个属性,我想saveToFile在每次属性更改时调用。
我不希望覆盖每个属性的设置器。我应该覆盖
-[NSObject methodForSelector]吗?最好的方法是什么?
您可以注册为要监视的属性的观察者。可可的KVO功能将在这里为您提供帮助。
基本上,您需要调用addObserver:forKeyPath:options:context:并注册以在属性更改时得到通知。发生这种情况时,运行时将在observeValueForKeyPath:ofObject:change:context:注册为观察者的对象上调用该方法。您可以在此处进行您想要的保存。
注册示例:
for(NSString *propName in self.propsIWantMonitored) {
[self addObserver:self forKeyPath:propName change:0 context:@selector(saveToFile)];
}
Run Code Online (Sandbox Code Playgroud)
为了处理prop值的更改:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
// make sure we don't interfere with other observed props
// and check the context param
if (context == @selector(saveToFile)) {
[self saveToFile];
}
}
Run Code Online (Sandbox Code Playgroud)
并注销:
for(NSString *propName in self.propsIWantMonitored) {
[self removeObserver:self forKeyPath:propName context:@selector(saveToFile)];
}
Run Code Online (Sandbox Code Playgroud)
上面的代码示例假定您已声明要监视的属性数组,用于注册为观察者。您可以使用该context参数来确定是否observeValueForKeyPath调用了您刚刚注册的观察员,以免与班级其他部分进行的其他KVO注册发生冲突。
上述方法有一个警告:如果连续设置多个属性,则该saveToFile方法将在短时间内多次调用,这可能会导致性能瓶颈并增加应用程序的能耗。
另一种方法是dirty设置一个标志observeValueForKeyPath:并在中进行重置saveToFile。而且,您可以saveToFile检查该标志,并且如果对象不脏则不要使用文件系统。
您可以安排一个计时器,该计时器将定期调用saveToFile,这样,一次设置多个属性将只能访问一个磁盘。saveToFile当您希望立即保存时,可以随时手动呼叫。
注意。在计时器方面,我指的是GCD计时器,因为NSTimer还会对您的应用程序产生负面的能量影响。
小智 5
你想要的是所谓的键值观察或 KVO。例如,您注册一个方法,每次属性更改时都会调用该方法。
如果您有一个文本字段并且您想收听对其文本的更改,您可以像这样注册
[self.textField addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil];
Run Code Online (Sandbox Code Playgroud)
在您的课程中,您将实现此方法:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if ([keyPath isEqualToString:@"text"]) {
NSLog(@"Textfield changed - MAKE CHANGES HERE");
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个不错的教程,如果您不熟悉 KVO:http : //www.appcoda.com/understanding-key-value-observing-coding/
| 归档时间: |
|
| 查看次数: |
3928 次 |
| 最近记录: |