gpt4 book ai didi

ios - 自己添加观察者

转载 作者:可可西里 更新时间:2023-11-01 05:04:45 27 4
gpt4 key购买 nike

一个很简单的问题,但我似乎找不到答案。 (开发 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com