gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:42:25 27 4
gpt4 key购买 nike

我曾经在 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 重现它。我只能订阅其正在执行的可观察对象:

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

最佳答案

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

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

我们有an issue来处理这个,但我还没来得及多想。你有任何建议或资源都会很棒 🙇

关于ios - 将对象发送给 RxSwift Action 的订阅者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36173034/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com