2016-10-13 4 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 «s в ослабленном группе 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() 
     } 
} 
Смежные вопросы