Swift iOS ReactiveKit:调用观察器会导致多次触发操作?

时间:2018-10-19 06:27:53

标签: ios swift reactivekit

我有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.

1 个答案:

答案 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)

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