Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift KVO:如何避免静电干扰?_Swift_Key Value Observing - Fatal编程技术网

Swift KVO:如何避免静电干扰?

Swift KVO:如何避免静电干扰?,swift,key-value-observing,Swift,Key Value Observing,在我的应用程序中,当应用程序检索到服务器发送的更新时,我想使用KVO更新UI。为此,我有一个名为“AutomaticRefreshProcess”的单例类,它每秒轮询服务器,如果有新的更新,则将其存储在属性lastUpdate中。我希望我的应用程序的任何对象(例如UIView、UIViewController,也可能通过业务模型NSObject)都可以观察到这个属性 我看到(至少在经验上)当你添加一个观察者时,keyPath不能让它的任何“节点”成为一个静态变量。因此,在我的观察者看来,我无法做

在我的应用程序中,当应用程序检索到服务器发送的更新时,我想使用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使其工作:)