2016-08-23 2 views
0

Я пытаюсь использовать библиотеку Action/CocoaAction. Первичное использование на данный момент - показать UIAlertController, а при нажатии кнопки UIAlertAction он должен вызвать функцию, определенную в моей модели viewModel (changeAddress, которая возвращает Observable).CocoaAction/Действие с UIAlertController

Мое понимание этого было бы:

let ac = CocoaAction(workFactory: {[unowned self] _ in 
    self.viewModel!.requestChangeAddress() 
     .subscribeNext({ [unowned self] data in 
      if let response = data?.result 
      { 
       self.showResultOperation(response) 
      } 
     }) 
     .addDisposableTo(self.disposeBag) 
     return .empty() 
    }) 

let OKAction = UIAlertAction.Action("OK", style: .Default) 
OKAction.rx_action = ac 

Но, к сожалению, она не работает. Закрытие workFactory правильно вызывается, но подписка не вступает в силу. Я знаю, что что-то не так, когда я возвращаюсь, но я не понимаю, как это решить.

Как это исправить? Что я делаю неправильно?

Спасибо.

ответ

0

Отличный вопрос! Благодарим за отправку кода.

Таким образом, ваш код получает наблюдаемый от requestChangeAddress, но затем он подписывается на него и добавляет его в мешок для удаления. Класс Action на самом деле собирается позаботиться об этом для вас, вам нужно вернуть только одноразовое.

Проблема заключается в том, что вы хотите что-то сделать со значениями, отправленными в действие, и возврат наблюдаемого не позволит вам это сделать. Поэтому вам необходимо включить вызов в doOnNext в цепочку наблюдателей. Вот что это может выглядеть следующим образом:

let ac = CocoaAction(workFactory: {[unowned self] _ in 
    return self.viewModel! 
     .requestChangeAddress() 
     .doOnNext({ [unowned self] data in 
      if let response = data?.result 
      { 
       self.showResultOperation(response) 
      } 
     }) 
     .map { _ in Void() } 
}) 

Использование doOn функции в RxSwift является отличным способом, чтобы придать побочные эффекты в ваш наблюдаемые при необходимости, как это здесь.

EDIT: Я добавил карту в конец, чтобы исправить ошибку компилятора, потому что тип возврата с заводского метода - Observable<Void>.

+0

Спасибо, я пробовал это сделать, но на первой строке компилятор дает эту ошибку: «Невозможно преобразовать значение типа» (_) -> Наблюдаемый

'в ожидаемый аргумент типа _ _> Наблюдаемый <_>' " – jerrygdm

+0

Ah , правильно! Я уточню свой ответ. –

+0

Спасибо ... почти все отлично. У меня есть проблема, связанная с этим ... после нажатия ok или отмены в alertContoller кнопка выглядит как отключенная, больше не срабатывает. Как я могу решить проблему? – jerrygdm