Swift KVO:如何避免静电干扰?
在我的应用程序中,当应用程序检索到服务器发送的更新时,我想使用KVO更新UI。为此,我有一个名为“AutomaticRefreshProcess”的单例类,它每秒轮询服务器,如果有新的更新,则将其存储在属性lastUpdate中。我希望我的应用程序的任何对象(例如UIView、UIViewController,也可能通过业务模型NSObject)都可以观察到这个属性 我看到(至少在经验上)当你添加一个观察者时,keyPath不能让它的任何“节点”成为一个静态变量。因此,在我的观察者看来,我无法做到:Swift KVO:如何避免静电干扰?,swift,key-value-observing,Swift,Key Value Observing,在我的应用程序中,当应用程序检索到服务器发送的更新时,我想使用KVO更新UI。为此,我有一个名为“AutomaticRefreshProcess”的单例类,它每秒轮询服务器,如果有新的更新,则将其存储在属性lastUpdate中。我希望我的应用程序的任何对象(例如UIView、UIViewController,也可能通过业务模型NSObject)都可以观察到这个属性 我看到(至少在经验上)当你添加一个观察者时,keyPath不能让它的任何“节点”成为一个静态变量。因此,在我的观察者看来,我无法做
addObserver(self, forKeyPath:#keyPath(AutomaticRefreshProcess.lastUpdate), options: [.new], context: nil)
我试过了,这会使应用程序崩溃。我能做的是,对于我的所有观察者,在init处声明一个属性集,将其设置为AutomaticRefreshProcess.lastUpdate。我试过了,成功了
class MyObserver : NSObject {
@objc dynamic let lastUpdate = AutomaticRefreshProcess.lastUpdate
init()
{
addObserver(self, #keyPath(lastUpdate), ...)
}
}
这很有效,但我觉得它是多余的。另外,我还想定制observeValue原始函数,通过一个更方便的特定函数来覆盖它,以处理这些更新,如:
override observeUpdate(newUpdates:[Update], ofType: UpdateType) { ... }
为此,我可以创建一个类ARPObserver,并从中对所有观察者进行子类化。问题是,如何使所有UIKit对象一次“符合”这个父类?我不想重写每个UIKit对象,使其成为“ARPOberser”,比如UIViewARPObserver、UIViewControllerARPObserver等等
所以我的问题是:有没有比将所有UIView、UIViewController等子类化更好的设计模式来让所有UIKit对象都成为ARP观察者?我很想使用扩展,但你不能在那里存储道具,我需要存储ARP实例,使其在
addObserver
的关键路径中可用。这是否回答了你的问题?是的,谢谢,我必须使用singleton使其工作:)