Отправить объект подписчику RxSwift Action

Раньше я использовал ReactiveCocoa в Objective-C, но с тех пор перешел на 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?


person jwswart    schedule 23.03.2016    source источник


Ответы (1)


Это возможно с помощью Action, но в настоящее время это непросто. Проблема в том, что для установки свойства Action для объекта свойство этого объекта должно объявить полный общий тип Action, который обычно равен Action<Void, Void> (это typealias'd на CocoaAction). Два общих типа - это вход и выход соответственно. Мы выбрали Void, потому что он отражает тот факт, что работа была сделана, но не заботится о том, что это за работа. Это не идеальное решение, поскольку оно приводит к проблеме, с которой вы сейчас сталкиваетесь, и я сожалею об этом.

Вы хотите подписаться на вывод сигнала действия, но из-за использования Void в качестве вывода вы не можете. Подход PublishSubject, который у вас есть, - это один обходной путь, другое решение - использовать Void в качестве типа вывода; вы можете использовать ошибки для обозначения неудачи и Void() для обозначения успеха, но вся работа, которую вы хотите выполнить, должна быть инкапсулирована в сигнал Action. Я бы, наверное, использовал второй подход, но он может работать не во всех случаях.

У нас есть проблема, чтобы решить эту проблему, но у меня не было времени уделять ей много внимания. мысль. Любые предложения или ресурсы, которые у вас есть, будут потрясающими ????

person Ash Furrow    schedule 23.03.2016