Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.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
Ios 如何仅针对onCompleted()事件使用Rx Swift PublishRelay(无类型)?_Ios_Swift_Rx Swift - Fatal编程技术网

Ios 如何仅针对onCompleted()事件使用Rx Swift PublishRelay(无类型)?

Ios 如何仅针对onCompleted()事件使用Rx Swift PublishRelay(无类型)?,ios,swift,rx-swift,Ios,Swift,Rx Swift,我的代码中有此视图模型: import RxSwift protocol ViewModelInput { func buttonTouched() } protocol ViewModelOutput { var done : PublishRelay<Bool> { get set } } protocol ViewModelType { var inputs: ViewModelInput { get } var outputs: View

我的代码中有此视图模型:

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)
    }
}
老实说,我不需要带有
PublishRelay
Boolean
值。我甚至不需要
onNext()
事件。我只需要通知我的协调员(使用此视图模型的应用程序的一部分)有关
onCompleted()
。但是,仍然有一些
泛型类型添加到我的输出中。我不需要这些。有没有更干净的方法来实现这一点

我考虑过像
Completable
这样的特性,但据我所知,我需要在
create()
方法中发出已完成的事件,或者使用
Completable.empty()
。或者也许我不太了解这些特质,我不知道


有什么想法吗?

我已经有一段时间没有做过任何RxSwift了,但是你试过让类型
PublishRelay
?一旦你这样做了,你就可以在你的
按钮touched()
方法中把
()
传递到
outputs.done.accept(())
,而不必担心传递不需要的任意信息

我已经有一段时间没有做过任何RxSwift了,但是你试过让类型
PublishRelay
吗?一旦你这样做了,你就可以在你的
按钮touched()
方法中将
()
传递给
输出。完成。接受(())
,而不必担心传递不需要的任意信息

我认为@Steven0351使用方法是正确的。只有两件小事:

  • 它还应该通过终止主题而不是发出无效值来工作。它在订阅中看起来也更干净

  • 我猜您正在订阅UI中的outputs.done主题。在这种情况下,您可能需要使用驱动程序。这样就不需要在主调度器上指定观察(以及其他驱动程序的优点)

  • 视图模型

    internal var done = PublishRelay<Void>.init()
    
    func buttonTouched() {
        self.outputs.done.onCompleted()
    }
    

    我认为@Steven0351的方法是正确的。只有两件小事:

  • 它还应该通过终止主题而不是发出无效值来工作。它在订阅中看起来也更干净

  • 我猜您正在订阅UI中的outputs.done主题。在这种情况下,您可能需要使用驱动程序。这样就不需要在主调度器上指定观察(以及其他驱动程序的优点)

  • 视图模型

    internal var done = PublishRelay<Void>.init()
    
    func buttonTouched() {
        self.outputs.done.onCompleted()
    }
    

    Rx始终为指定类型的零或多个值。如果您正在生成零元素,那么类型就不那么重要了。在.NET中,对于void类型,有一个特殊的类型
    Unit
    。我想象RxSwift也有同样的东西。使用该选项。Rx始终为指定类型的零或多个值。如果您正在生成零元素,那么类型就不那么重要了。在.NET中,对于void类型,有一个特殊的类型
    Unit
    。我想象RxSwift也有同样的东西。使用它。是的,我一点也不喜欢这个
    ,但这似乎是唯一的解决方案:)所以本质上它也可以表示done=PublishRelay()对吗?@amitsigh是的,应该也可以这样做。是的,我一点也不喜欢这个
    ,但这似乎是唯一的解决方案:)所以本质上它也可以表示done=PublishRelay()对吗?@amitsigh是的,应该也可以这样做。
    viewModel.outputs.done
        .asDriver()
        .drive(onCompleted: { [weak self] in
            // whatever
        }).disposed(by: disposeBag)