2016-04-25 38 views
3

有誰知道你會怎樣將SKPaymentQueue包裝在Rx Observable中? SKPaymentQueue要求您通過SKPaymentQueue.addTransactionObserver方法註冊符合SKPaymentTransactionObserver的觀察員。如何在Rx中包裝SKPaymentQueue Observable

到目前爲止,我試過以下,但它不工作。我懷疑是因爲觀察員代理在被調用之前就被釋放了。這感覺就像我失去了某種慣用的Rx伎倆在這裏:

class StoreService { 
    let paymentQueue = SKPaymentQueue.defaultQueue() 

    func purchase(product: SKProduct) -> Observable<SKProduct> { 
     return Observable.create { (observer) in 
      let transactionObserver = PaymentTransactionProxyObserver(observer) 

      self.paymentQueue.addTransactionObserver(transactionObserver) 

      let payment = SKPayment(product: product) 
      self.paymentQueue.addPayment(payment) 

      return AnonymousDisposable { 
       self.paymentQueue.removeTransactionObserver(transactionObserver) 
      } 
     } 
    } 
} 

class PaymentTransactionProxyObserver: NSObject, SKPaymentTransactionObserver { 

    let observer: AnyObserver<SKPaymentTransaction> 

    init(_ observer: AnyObserver<SKPaymentTransaction>) { 
     self.observer = observer 
    } 

    func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 
     for transaction in transactions { 
      observer.onNext(transaction) 
     } 
     observer.onCompleted() 
    } 
} 

我也是在RxCocoa源獵殺四處尋找靈感但是最接近例如,NSNotificationCenter擴展,使用了閉包,而不是一個具有多個回調方法的觀察者一個註冊和註銷步驟。它似乎也不適合其他擴展使用的DelegateProxy模式。

回答

1

你是對的,你的代理被刪除得太快。 PaymentTransactionProxyObserver需要持有自己的參考,以保持自己的活着,然後在它調用onCompleted之後沒有該參考。

這是一個靈感的要點。它使用Promises而不是Rx,但它應該可以幫助你理解這個想法。當看這個代碼時,可以將PromiseKit的fulfill方法看作observer.onNext; observer.onCompleted和PromiseKit的reject作爲observer.onError

https://gist.github.com/dtartaglia/b92163d6055e1a580d493676e5b1e448

相關問題