This repository was archived by the owner on Dec 3, 2022. It is now read-only.
forked from PromiseKit/StoreKit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSKProductsRequest+Promise.swift
More file actions
90 lines (72 loc) · 2.19 KB
/
SKProductsRequest+Promise.swift
File metadata and controls
90 lines (72 loc) · 2.19 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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import StoreKit
#if !PMKCocoaPods
import PMKCancel
import PromiseKit
#endif
/**
To import the `SKRequest` category:
use_frameworks!
pod "PromiseKit/StoreKit"
And then in your sources:
import PromiseKit
*/
extension SKProductsRequest {
/**
Sends the request to the Apple App Store.
- Returns: A promise that fulfills if the request succeeds.
*/
public func start(_: PMKNamespacer) -> Promise<SKProductsResponse> {
let proxy = SKDelegate()
delegate = proxy
proxy.retainCycle = proxy
start()
return proxy.promise
}
}
fileprivate class SKDelegate: NSObject, SKProductsRequestDelegate {
let (promise, seal) = Promise<SKProductsResponse>.pending()
var retainCycle: SKDelegate?
@objc fileprivate func request(_ request: SKRequest, didFailWithError error: Error) {
seal.reject(error)
retainCycle = nil
}
@objc fileprivate func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
seal.fulfill(response)
retainCycle = nil
}
}
// perhaps one day Apple will actually make their errors into Errors…
//extension SKError: CancellableError {
// public var isCancelled: Bool {
// return true
// }
//}
//////////////////////////////////////////////////////////// Cancellation
extension SKProductsRequest {
/**
Sends the request to the Apple App Store.
- Returns: A cancellable promise that fulfills if the request succeeds.
*/
public func startCC(_: PMKNamespacer) -> CancellablePromise<SKProductsResponse> {
let proxy = SKDelegate()
delegate = proxy
proxy.retainCycle = proxy
let cp = CancellablePromise(task: SKRequestTask(self, proxy), promise: proxy.promise, resolver: proxy.seal)
start()
return cp
}
}
fileprivate class SKRequestTask: CancellableTask {
let request: SKRequest
let proxy: SKDelegate
init(_ request: SKRequest, _ proxy: SKDelegate) {
self.request = request
self.proxy = proxy
}
var isCancelled = false
func cancel() {
request.cancel()
proxy.retainCycle = nil
isCancelled = true
}
}