我以前在Objective-C中使用ReactiveCocoa但是我已经切换到RxSwift,因为我发现它比RAC4更容易理解。但是我在RAC中做的事情很有用:
@weakify(self);
[[RACCommand alloc] initWithEnabled:RACObserve(self, valid) signalBlock:^RACSignal *(id input) {
@strongify(self);
return [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//make network call
//send responseObject to subscriber
[subscriber sendNext:responseObject];
[subscriber sendCompleted];
return nil;
}] materialize];
}];
这允许我为它的执行状态及其执行信号订阅命令,以便我可以观察从调用返回的数据。
我不确定如何使用RxSwift Action重现这一点。我只能订阅其执行的observable:
var loader: NotificationType?
formButton.rx_action!.executing.subscribeNext({ [weak self] (executing) -> Void in
if executing {
loader = self?.showNotification(.Loading, title: self?.viewModel.loaderTitle.value, message: "Please wait".localized, timeout: -1)
}
else {
if let loader = loader {
loader.dismiss()
}
}
}).addDisposableTo(disposeBag)
但我必须创建一个额外的PublishSubject
来发送我的回复数据:
viewModel.submitSubject.subscribe(onNext: { (response) -> Void in
print(response)
}, onError: { (error) -> Void in
print(error)
}, onCompleted: { () -> Void in
//completed
}) { () -> Void in
}.addDisposableTo(disposeBag)
有没有办法在RxSwift中使用Action创建类似的模式?
答案 0 :(得分:0)
这可以通过Action实现,但目前并不简单。问题是要在对象上设置Action
属性,该对象的属性必须声明Action
的完整泛型类型,通常为Action<Void, Void>
(这是{{ 1}}&#39; d到typealias
)。两种泛型类型分别是输入和输出。我们之所以选择CocoaAction
,是因为它代表了工作已经完成的事实,但并不关心它是什么工作。它不是一个完美的解决方案,因为它会导致您目前面临的问题,我很抱歉。
您想要订阅动作信号的输出,但由于使用Void
作为输出,您无法做到。您在此处使用的Void
方法是一种解决方法,另一种解决方案是使用PublishSubject
作为输出类型;您可以使用错误来指示失败,Void
表示成功,但您想要做的所有工作都需要封装在Void()
的信号中。我可能会使用第二种方法,但它可能并不适用于所有情况。
我们有an issue来解决这个问题,但我没有时间考虑这个问题。你有任何建议或资源都很棒