2016-08-23 52 views
0

我正在嘗試使用Action/CocoaAction庫。 現在的主要用法是顯示一個UIAlertController,當一個UIAlertAction按鈕被點擊時,它必須調用在我的viewModel(changeAddress返回一個Observable)中定義的函數。CocoaAction/Action with 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閉包被正確調用,但訂閱不生效。當我返回.empty時,我知道某些錯誤,但我無法理解如何解決。

我該如何解決這個問題?我做錯了什麼?

謝謝。

回答

0

很好的問題!感謝您發佈代碼。

所以,你的代碼是從requestChangeAddress獲得可觀的,但後來它的訂閱它,將它添加到處置袋。 Action課程實際上是爲你照顧的,你只需要退回一次性用品。

問題是,你想要對動作發送的值做些什麼,並且返回observable不會讓你這樣做。因此,您需要在觀察鏈中包含對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() } 
}) 

使用RxSwift doOn功能是注射的副作用到您的觀測在必要的時候,就像是這裏的好方法。

編輯:我加入地圖在端部固定一個編譯器錯誤,因爲從工廠方法返回類型爲Observable<Void>

+0

謝謝,我試着這樣做,但在第一行編譯器給出此錯誤:「無法將類型'(_) - > Observable

'的值轉換爲'_ - > Observable'的預期參數'」 – jerrygdm

+0

, 對!我會更新我的答案。 –

+0

謝謝......幾乎都很好。我有一個與此相關的問題...點擊OK或取消後在alertContoller該按鈕看起來像禁用,沒有更多的觸摸射擊。我該如何解決這個問題? – jerrygdm