首页 > 解决方案 > 我如何使用没有类型的 Rx Swift PublishRelay 仅用于 onCompleted() 事件?

问题描述

我的代码中有这个视图模型:

import RxSwift

protocol ViewModelInput {
    func buttonTouched()
}

protocol ViewModelOutput {
    var done : PublishRelay<Bool> { get set }
}

protocol ViewModelType {
    var inputs: ViewModelInput { get }
    var outputs: ViewModelOutput { get }
}

public final class ViewModel: ViewModelInput, ViewModelOutput, ViewModelType {

    var inputs: ViewModelInput { return self }
    var outputs: ViewModelOutput { return self }

    internal var done = PublishRelay<Bool>.init()

    init() {}

    func buttonTouched() {
        self.outputs.done.accept(true)
    }
}

我正在使用它的“输出”,如下所示:

// Somewhere else in my app
        viewModel.outputs.done
        .asObservable()
        .observeOn(MainScheduler.instance)
        .subscribe(onNext: { [weak self] _ in
            // whatever
        }).disposed(by: disposeBag)

老实说,我不需要Boolean. PublishRelay我什至不需要onNext()事件。我只需要通知我的协调员(使用此视图模型的应用程序的一部分)关于onCompleted(). 但是,我的输出中仍然<Bool>添加了一些通用类型。我不需要这些。有没有更清洁的方法来实现这一目标?

我虽然关于特征,Completable但据我所知,我需要在create()方法或使用中发出完成事件Completable.empty()。或者也许我不了解那些好的特质,我不知道。

有任何想法吗?

标签: iosswiftrx-swift

解决方案


我有一段时间没有做过任何 RxSwift 了,但是你有没有尝试过创建 type PublishRelay<Void>?一旦你这样做了,你就可以在你的方法中传递(),而不必担心传递不需要的任意信息outputs.done.accept(())buttonTouched()


推荐阅读