@@ -20,7 +20,7 @@ extension SKProductsRequest {
2020 - Returns: A promise that fulfills if the request succeeds.
2121 */
2222 public func start( _: PMKNamespacer ) -> Promise < SKProductsResponse > {
23- let proxy = SKDelegate ( )
23+ let proxy = SKDelegate ( request : self )
2424 delegate = proxy
2525 proxy. retainCycle = proxy
2626 start ( )
@@ -29,10 +29,17 @@ extension SKProductsRequest {
2929}
3030
3131
32- fileprivate class SKDelegate : NSObject , SKProductsRequestDelegate {
32+ fileprivate class SKDelegate : NSObject , SKProductsRequestDelegate , CancellableTask {
3333 let ( promise, seal) = Promise< SKProductsResponse> . pending( )
34+ let request : SKRequest
3435 var retainCycle : SKDelegate ?
3536
37+ init ( request: SKRequest ) {
38+ self . request = request
39+ super. init ( )
40+ promise. setCancellableTask ( self , reject: seal. reject)
41+ }
42+
3643 @objc fileprivate func request( _ request: SKRequest , didFailWithError error: Error ) {
3744 seal. reject ( error)
3845 retainCycle = nil
@@ -42,6 +49,14 @@ fileprivate class SKDelegate: NSObject, SKProductsRequestDelegate {
4249 seal. fulfill ( response)
4350 retainCycle = nil
4451 }
52+
53+ var isCancelled = false
54+
55+ func cancel( ) {
56+ request. cancel ( )
57+ retainCycle = nil
58+ isCancelled = true
59+ }
4560}
4661
4762// perhaps one day Apple will actually make their errors into Errors…
@@ -50,3 +65,16 @@ fileprivate class SKDelegate: NSObject, SKProductsRequestDelegate {
5065// return true
5166// }
5267//}
68+
69+ //////////////////////////////////////////////////////////// Cancellable wrapper
70+
71+ extension SKProductsRequest {
72+ /**
73+ Sends the request to the Apple App Store.
74+
75+ - Returns: A cancellable promise that fulfills if the request succeeds.
76+ */
77+ public func cancellableStart( _: PMKNamespacer ) -> CancellablePromise < SKProductsResponse > {
78+ return cancellable ( start ( . promise) )
79+ }
80+ }
0 commit comments