-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathSKReceiptRefreshRequest+Promise.swift
More file actions
52 lines (42 loc) · 1.36 KB
/
SKReceiptRefreshRequest+Promise.swift
File metadata and controls
52 lines (42 loc) · 1.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#if !PMKCocoaPods
import PromiseKit
#endif
import StoreKit
extension SKReceiptRefreshRequest {
public func promise() -> Promise<SKReceiptRefreshRequest> {
return ReceiptRefreshObserver(request: self).promise
}
}
private class ReceiptRefreshObserver: NSObject, SKRequestDelegate, CancellableTask {
let (promise, seal) = Promise<SKReceiptRefreshRequest>.pending()
let request: SKReceiptRefreshRequest
var retainCycle: ReceiptRefreshObserver?
init(request: SKReceiptRefreshRequest) {
self.request = request
super.init()
request.delegate = self
request.start()
retainCycle = self
}
func requestDidFinish(_: SKRequest) {
seal.fulfill(request)
retainCycle = nil
}
func request(_: SKRequest, didFailWithError error: Error) {
seal.reject(error)
retainCycle = nil
}
var isCancelled = false
func cancel() {
request.cancel()
retainCycle = nil
isCancelled = true
}
}
//////////////////////////////////////////////////////////// Cancellation
extension SKReceiptRefreshRequest {
public func cancellablePromise() -> CancellablePromise<SKReceiptRefreshRequest> {
let rro = ReceiptRefreshObserver(request: self)
return CancellablePromise(task: rro, promise: rro.promise, resolver: rro.seal)
}
}