【发布时间】:2014-07-27 10:47:01
【问题描述】:
请注意,这个问题是在 2014 年 7 月写的,在 swift 之前 1.0,当时我几乎忽略了有关 swift 的任何内容,并试图将代码从 objC“翻译”为 swift。这不是一个好的解决方案,我现在知道了 更好的。 KVO 是我们在 ObjC 中喜欢的东西,但我强烈建议不要 在 swift 中使用它并在 swift 中探索一些替代方案。 http://blog.scottlogic.com/2015/02/11/swift-kvo-alternatives.html。 记住:如果某事很难做到,那么也许它不是注定要做到的 完成。
作为一名 obj-C 开发人员,我已经习惯了 KVO 一年了,而且经常出现的问题之一是调用 removeObserver:forKeyPath: 的潜在不安全性
我通常用@try...@catch 子句围绕它...
现在有了swift,我还没有找到try ... catch thingy :)
有关如何解决该问题的任何线索?
干杯
这是我的意思的一个例子
override func viewDidLoad()
{
super.viewDidLoad();
self.summaryTextView.text = self.show?.overview;
self.title = self.show?.title;
if(self.show?.imageData)
{
self.posterImageView.image = UIImage(data: self.show?.imageData);
}
else
{
self.posterImageView.image = UIImage(named:"wait");
show?.addObserver(self, forKeyPath: "imageData", options: NSKeyValueObservingOptions.New, context: nil);
}
}
override func viewDidDisappear(animated: Bool)
{
// Will crash if self was not a observer in the first place
self.show?.removeObserver(self, forKeyPath:"imageData");
}
override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: NSDictionary!, context: CMutableVoidPointer)
{
self.posterImageView.image = UIImage(data: self.show?.imageData);
}
【问题讨论】:
-
请注意,Swift 2 现在包括 try/catch。
-
感谢更新:)
-
另请注意,这个问题写于 2014 年 7 月,在 swift 1.0 之前,当时我几乎忽略了关于 swift 的任何内容,并试图将代码从 objC“翻译”为 swift。这不是一个好的解决方案,我现在知道得更好了。 KVO 是我们在 ObjC 中喜欢的东西,但我强烈建议不要快速使用它并探索其他方式。 blog.scottlogic.com/2015/02/11/swift-kvo-alternatives.html