2016-04-25 20 views
3

Rx ObservableでSKPaymentQueueをラップする方法を知っていますか? SKPaymentQueueではSKPaymentTransactionObserverに準拠したオブザーバーをSKPaymentQueue.addTransactionObserverメソッドで登録する必要があります。RxでSKPaymentQueueをラップする方法Observable

これまでのところ、私は以下を試しましたが、うまくいきません。オブザーバプロキシが呼び出される前に、オブザーバプロキシの割り当てが解除されているためと思われます。 、私はまた、インスピレーションを探してRxCocoaソースの周りNSNotificationCenter拡張子が最も近い例を狩ってきた

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() 
    } 
} 

とは対照的に、クロージャを使用しています。それは私がここに慣用のRxトリックのいくつかの種類が欠けているように感じています複数のコールバックメソッドを持つオブザーバは、レジスタと登録解除のステップを実行します。また、他の拡張機能で使用されているDelegateProxyパターンには適合していないようです。

答えて

1

あなたのプロキシはあまりにも速く削除されています。 PaymentTransactionProxyObserverは、それ自身を生かし続けるために自身への参照を保持する必要があり、次にonCompletedを呼び出した後でその参照をヌルにする必要があります。

ここはインスピレーションの要点です。それはRxではなくPromisesを使用しますが、それはあなたがそのアイデアを得るのを助けるでしょう。このコードを見るとPromiseKitのfulfillメソッドはobserver.onNext; observer.onCompleted、PromiseKitのrejectobserver.onErrorと考えられます。

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

関連する問題