1

我有一个单例类,我用它来观察一个属性并触发下一个动作。

单例类:

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)

这是我的单例设计模式或observeNext多次调用的问题。(BridgeDispatcher.sharedInstance.onPopCurrentViewController.observeNext{} )

Need help.
4

1 回答 1

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)

它尝试以两种方式处理多个调用:首先通过丢弃任何重复的事件,因此如果持续时间没有改变,则不进行调用。其次,通过对信号进行去抖动,因此如果用户进行了一系列更改,我们仅在他们完成更改后才调用该方法。

于 2020-03-02T12:32:55.177 回答