我有Singleton类,我曾使用该类来观察属性并触发下一个动作。
单班:
public class BridgeDispatcher: NSObject {
open var shouldRespondToBridgeEvent = SafePublishSubject<[String: Any]>()
open var shouldPop = SafePublishSubject<Void>()
open var shouldUpdate = SafePublishSubject<Void>()
public let disposeBag = DisposeBag()
open static let sharedInstance: BridgeDispatcher = BridgeDispatcher()
override init() {
super.init()
shouldRespondToBridgeEvent.observeNext { event in
if let type = event["type"] as? String {
switch type {
case "ShouldUpdate":
self.onShiftBlockDidUpdateHeight.next()
case "shouldPop":
self.onPopCurrentViewController.next(())
default:
print("Event not supported")
}
}
}.dispose(in: self.disposeBag)
}
}
上述方法将通过以下方式触发:
BridgeDispatcher.sharedInstance.shouldRespondToBridgeEvent.next(body)
注册onPopCurrentViewController:
BridgeDispatcher.sharedInstance.onPopCurrentViewController.observeNext { doSomething() }.dispose(in: BridgeDispatcher.sharedInstance.disposeBag)
在我的应用程序中,由于业务逻辑,BridgeDispatcher.sharedInstance.onPopCurrentViewController.observeNext{}
方法将被多次调用,由于此doSomething()
方法将在调用BridgeDispatcher.sharedInstance.shouldRespondToBridgeEvent.next(body)
时触发多次。
我的 singleton 设计模式或 observeNext 多次调用是此问题吗? (BridgeDispatcher.sharedInstance.onPopCurrentViewController.observeNext{} )
Need help.
答案 0 :(得分:0)
我在ObservableComponent上使用了.updateSignal。
valueToUpdate.updateSignal.compactMap { (arg0) -> String? in
let (value, _, validationFailure) = arg0
return validationFailure == nil ? value?.value : nil
}
.removeDuplicates()
.debounce(for: 1.0)
.observeNext { [unowned self] _ in
self.doYourWork()
}
.dispose(in: self.bag)
它尝试以两种方式处理多次通话:首先通过丢弃任何重复的事件,因此,如果持续时间没有更改,则不会进行通话。其次,通过对信号进行去抖动,以便在用户进行大量更改时,我们仅在完成更改后才调用该方法。