2016-10-13 167 views
1

我需要一個封裝了複雜的IAP購買樹成返回布爾觀察到一個簡單的attemptPurchase函數的函數(真 - >成功,假 - >取消,錯誤 - >任何錯誤)可觀察與決策樹

但是我很難理解我如何創建這個功能,主要是因爲決定的開始是異步的。

決策樹和代碼如下=>幫助非常感謝!

enter image description here

// fails -> missing return function 
// but i cannot return the credit check, since the execution is different depending on the result 

func attemptPurchase(amount: Int) -> Observable<Bool>{ 

    let creditCheck = creditCheck(amount) 

    creditCheck.filter{$0}.subscribeNext{ _ in 
    return Observable.just(true) 
    } 

    creditCheck.filter{$0}.subscribeNext{ _ in 
    return confirmIAP().processIAP() 
    } 
} 

func creditCheck(amount: Int) -> Observable<Bool>{ 
    return API.creditCheck.map{$0 > amount} 
} 

func confirmIAP() -> Observable<Bool> { 
    // UI for confirming IAP 
} 

func processIAP() -> Observable<Bool> { 
    // UI for uploading IAP on my server 
} 

回答

1

這是你如何能做到這一點:

func attemptPurchase(amount: Int) -> Observable<Bool> { 
    return creditCheck(amount) 
     .flatMapLatest { (enoughCredit: Bool) -> Observable<Bool> in 
      if enoughCredit { 
       return Observable.just(true) 
      } else { 
       return confirmIAP() 
        .flatMapLatest { (isConfirmed: Bool) -> Observable<Bool> in 
         if isConfirmed { 
          return processIAP() 
         } else { 
          return Observable.just(false) 
         } 
        } 
      } 
     } 
} 
+0

謝謝你的回答,多少不勝感激!還有另外一個答案,我發現更多的rx-ty。只是添加了它。你怎麼看? –

+0

他們的行爲不同,但我不確定你需要哪一個。 – solidcell

+0

他們爲什麼不同?都達到了這個問題的目的 –

0

iankeen的該RxSwift鬆弛組答案:

func attemptPurchase(amount: Int) -> Observable<Bool>{ 
    return creditCheck(amount) 
     .flatMap { enough in 
      return (enough ? .just(true) : confirmIAP()) 
     } 
     .flatMap { ready in 
      guard ready else { /* failure */ } 
      return processIAP() 
     } 
}