有谁知道如何在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模式。
答案 0 :(得分:1)
你是对的,你的代理被删除得太快了。 PaymentTransactionProxyObserver
需要保留对自身的引用以使其自身保持活跃状态,然后在调用onCompleted
之后将其引用。
这是灵感的要点。它使用Promises而不是Rx,但它应该可以帮助你理解。在查看此代码时,请将PromiseKit的fulfill
方法视为observer.onNext; observer.onCompleted
,将PromiseKit的reject
视为observer.onError
。
https://gist.github.com/dtartaglia/b92163d6055e1a580d493676e5b1e448