1

以前は Objective-C で ReactiveCocoa を使用していましたが、RAC4 よりも理解しやすい RxSwift に切り替えました。ただし、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で同様のパターンを作成する方法はありますか?

4

1 に答える 1

0

これはActionで可能ですが、現時点では簡単ではありません。問題はAction、オブジェクトにプロパティを設定するには、そのオブジェクトのプロパティが の完全なジェネリック型を宣言しなければならないことActionです。2 つのジェネリック型は、それぞれ入力と出力です。これは、作業が完了したという事実を表しているためですが、それがどのような作業であるかは気にしません。現在直面している問題につながるため、完全な解決策ではありません。申し訳ありません。Action<Void, Void>typealiasCocoaActionVoid

アクションのシグナルの出力をサブスクライブしたいのですが、Void出力として使用しているためできません。ここでのPublishSubjectアプローチは 1 つの回避策です。別の解決策はVoid、を出力タイプとして使用することです。エラーを使用して失敗Void()を示し、成功を示すことができますが、実行したいすべての作業をActionのシグナルにカプセル化する必要があります。私はおそらく 2 番目のアプローチを使用しますが、すべての場合に機能するとは限りません。

これに対処する問題がありますが、あまり考える時間がありませんでした。あなたが持っている提案やリソースは素晴らしいでしょう

于 2016-03-23T13:59:12.557 に答える