2016-04-25 70 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

相关问题