From 1e73de5c75a391023b0fe2878764203ad4c8c2e6 Mon Sep 17 00:00:00 2001 From: Andrea Bizzotto Date: Mon, 21 Aug 2017 11:34:02 +0100 Subject: [PATCH] Dependency injection for ProductsInfoController --- SwiftyStoreKit/InAppProductQueryRequest.swift | 26 ++++++++++++------- SwiftyStoreKit/ProductsInfoController.swift | 9 +++++-- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/SwiftyStoreKit/InAppProductQueryRequest.swift b/SwiftyStoreKit/InAppProductQueryRequest.swift index 0a8ae22a..40134148 100644 --- a/SwiftyStoreKit/InAppProductQueryRequest.swift +++ b/SwiftyStoreKit/InAppProductQueryRequest.swift @@ -24,16 +24,30 @@ import StoreKit +typealias InAppProductRequestCallback = (RetrieveResults) -> Void + +protocol InAppProductRetriever: class { + func retrieveProducts(productIds: Set, callback: @escaping InAppProductRequestCallback) -> InAppProductQueryRequest +} + +class InAppProductQueryRetriever: InAppProductRetriever { + + func retrieveProducts(productIds: Set, callback: @escaping InAppProductRequestCallback) -> InAppProductQueryRequest { + let request = InAppProductQueryRequest(productIds: productIds, callback: callback) + request.start() + return request + } +} + class InAppProductQueryRequest: NSObject, SKProductsRequestDelegate { - typealias RequestCallback = (RetrieveResults) -> Void - private let callback: RequestCallback + private let callback: InAppProductRequestCallback private let request: SKProductsRequest // http://stackoverflow.com/questions/24011575/what-is-the-difference-between-a-weak-reference-and-an-unowned-reference deinit { request.delegate = nil } - private init(productIds: Set, callback: @escaping RequestCallback) { + init(productIds: Set, callback: @escaping InAppProductRequestCallback) { self.callback = callback request = SKProductsRequest(productIdentifiers: productIds) @@ -41,12 +55,6 @@ class InAppProductQueryRequest: NSObject, SKProductsRequestDelegate { request.delegate = self } - class func startQuery(_ productIds: Set, callback: @escaping RequestCallback) -> InAppProductQueryRequest { - let request = InAppProductQueryRequest(productIds: productIds, callback: callback) - request.start() - return request - } - func start() { request.start() } diff --git a/SwiftyStoreKit/ProductsInfoController.swift b/SwiftyStoreKit/ProductsInfoController.swift index 9b1681eb..2590790d 100644 --- a/SwiftyStoreKit/ProductsInfoController.swift +++ b/SwiftyStoreKit/ProductsInfoController.swift @@ -29,7 +29,12 @@ class ProductsInfoController: NSObject { struct InAppProductQuery { let request: InAppProductQueryRequest - var completionHandlers: [InAppProductQueryRequest.RequestCallback] + var completionHandlers: [InAppProductRequestCallback] + } + + let inAppProductRetriever: InAppProductRetriever + init(inAppProductRetriever: InAppProductRetriever = InAppProductQueryRetriever()) { + self.inAppProductRetriever = inAppProductRetriever } // As we can have multiple inflight queries and purchases, we store them in a dictionary by product id @@ -38,7 +43,7 @@ class ProductsInfoController: NSObject { func retrieveProductsInfo(_ productIds: Set, completion: @escaping (RetrieveResults) -> Void) { if inflightQueries[productIds] == nil { - let request = InAppProductQueryRequest.startQuery(productIds) { results in + let request = self.inAppProductRetriever.retrieveProducts(productIds: productIds) { results in if let query = self.inflightQueries[productIds] { for completion in query.completionHandlers {