1

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

4

1 回答 1

0

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

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

我们有一个问题要处理,但我没有时间考虑。您拥有的任何建议或资源都会很棒

于 2016-03-23T13:59:12.557 回答