对每个属性更改进行一些操作

Kam*_*rev 5 properties objective-c ios

我的课程中有几个属性,我想saveToFile在每次属性更改时调用。

我不希望覆盖每个属性的设置器。我应该覆盖 -[NSObject methodForSelector]吗?最好的方法是什么?

Cri*_*tik 6

您可以注册为要监视的属性的观察者。可可的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/