ios - 自己添加观察者

标签 ios objective-c key-value-observing self addobserver

一个很简单的问题,但我似乎找不到答案。 (开发 iOS 5+ 应用程序)。

在我的 AppDelegate 中,我有一个属性,我们称它为 @property (non atomic) BOOL aFlag;。我希望我的 AppDelegate 在值发生变化时得到通知。这是我尝试过的(一切都发生在 AppDelegate.m 中),这与我将两个不同的对象与观察者“链接”时相同:

-(BOOL)application:(UIApplication*)application 
       didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
    // Some stuff

    _aFlag = YES;
    [self addObserver:self 
           forKeyPath:@"aFlag" 
              options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) 
              context:nil];

    // Some other stuff
}


-(void)observeValueForKeyPath:(NSString*)keyPath 
                     ofObject:(id)object 
                       change:(NSDictionary*)change 
                      context:(void*)context {
    if ([keyPath isEqual:@"aFlag"]) {
        // Do something
    } else {
        // Do nothing
    }
}

但是 observeValueForKeyPath: 没有被调用。

我哪里错了?谢谢。

最佳答案

您应该实现自己的二传手。在那个 setter 中,您知道属性已经改变。

这样更优化。比在自己身上做 KVO 更好,也更便宜。

您的解决方案有效,从技术上讲,您可以自己进行 KVO。

但是,想象一下,如果您开始使用 NSNotificationCenter 从类内部触发类中的方法?可以吗?是的。应该吗?可能不是。您可能有这样一种情况,它没问题,但在干净的面向对象的解决方案中却不行。您应该为此向 self 发送消息。

这里也一样。实现这个:

- (void)setAFlag:(BOOL)flag;

例如:

- (void)setAFlag:(BOOL)flag{
    BOOL valueChanged = NO;    

    if(_aFlag != flag){
       valueChanged = YES;
    }
    _aFlag = flag;

    if(valueChanged)
        [self doSomethingWithTheNewValueOfFlag];
}

关于ios - 自己添加观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12728141/

相关文章:

ios - Clang : error: linker command failed with exit code 1 (use -v to see invocation) Xcode 10, Xcode 10.1 Beta,Swift 4.2

ios - NSFetchRequest "returnsDistinctResults"似乎被忽略了

macos - UILabel/NSTextView 与 CATextLayer

iOS 8 GPS 未启用

Objective-c:在基类上调用 [self message] 是调用后代方法

objective-c - 使用 KVO 观察自定义类的属性

iphone - 写入 plist 字典中的字符串

ios - 信号量在我的案例中没有按预期工作

ios - NSManagedObject 属性数组

objective-c - KVO 或如何在 Swift 中监听来自外部的属性更改