将对象发送给RxSwift Action的订阅者

时间:2016-03-23 08:25:18

标签: ios swift rx-swift

我以前在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创建类似的模式?

1 个答案:

答案 0 :(得分:0)

这可以通过Action实现,但目前并不简单。问题是要在对象上设置Action属性,该对象的属性必须声明Action的完整泛型类型,通常为Action<Void, Void>(这是{{ 1}}&#39; d到typealias)。两种泛型类型分别是输入和输出。我们之所以选择CocoaAction,是因为它代表了工作已经完成的事实,但并不关心它是什么工作。它不是一个完美的解决方案,因为它会导致您目前面临的问题,我很抱歉。

您想要订阅动作信号的输出,但由于使用Void作为输出,您无法做到。您在此处使用的Void方法是一种解决方法,另一种解决方案是使用PublishSubject作为输出类型;您可以使用错误来指示失败,Void表示成功,但您想要做的所有工作都需要封装在Void()的信号中。我可能会使用第二种方法,但它可能并不适用于所有情况。

我们有an issue来解决这个问题,但我没有时间考虑这个问题。你有任何建议或资源都很棒