【问题标题】:Send object to subscriber of RxSwift Action将对象发送给 RxSwift Action 的订阅者
【发布时间】:2016-03-23 08:25:17
【问题描述】:

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

【问题讨论】:

    标签: ios swift rx-swift


    【解决方案1】:

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

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

    我们有an issue 来处理这个问题,但我没有时间考虑太多。您拥有的任何建议或资源都会很棒?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      相关资源
      最近更新 更多