【问题标题】:addObserver on self自我添加观察者
【发布时间】:2012-10-04 13:16:14
【问题描述】:

一个非常简单的问题,但我似乎找不到答案。 (开发 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: 没有被调用。

我哪里错了?谢谢。

【问题讨论】:

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


    【解决方案1】:

    您应该实现自己的设置器。在那个二传手你知道poperty已经改变了。

    这种方式更加优化。比自己做 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];
    }
    

    【讨论】:

    • 嗯,这是一个很好的答案。我没有想到,它似乎比KVO解决方案更有效。唯一的事情是我有五个标志要观察......这意味着我需要实现 5 个设置器,或者使用带有所有标志的单个方法(可能更好)。感谢您的建议!
    • 这是一个很棒的答案 bool in bool
    猜你喜欢
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2016-06-06
    • 2012-01-21
    相关资源
    最近更新 更多