如何在Rx Observable

时间:2016-04-25 11:54:48

标签: ios swift storekit rx-swift

有谁知道如何在Rx Observable中包装SKPaymentQueue? SKPaymentQueue要求您通过SKPaymentTransactionObserver方法注册符合SKPaymentQueue.addTransactionObserver的观察者。

到目前为止,我已经尝试了以下但是它不起作用。我怀疑因为观察者代理在被调用之前被释放了。感觉我在这里错过了一些惯用的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 个答案:

答案 0 :(得分:1)

你是对的,你的代理被删除得太快了。 PaymentTransactionProxyObserver需要保留对自身的引用以使其自身保持活跃状态​​,然后在调用onCompleted之后将其引用。

这是灵感的要点。它使用Promises而不是Rx,但它应该可以帮助你理解。在查看此代码时,请将PromiseKit的fulfill方法视为observer.onNext; observer.onCompleted,将PromiseKit的reject视为observer.onError

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