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使用internal var done = PublishRelay<Void>.init()
func buttonTouched() {
self.outputs.done.onCompleted()
}
我认为@Steven0351的
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)