Browse Source

Dependency injection for ProductsInfoController

Andrea Bizzotto 8 years ago
parent
commit
1e73de5c75

+ 17 - 9
SwiftyStoreKit/InAppProductQueryRequest.swift

@@ -24,16 +24,30 @@
 
 import StoreKit
 
+typealias InAppProductRequestCallback = (RetrieveResults) -> Void
+
+protocol InAppProductRetriever: class {
+    func retrieveProducts(productIds: Set<String>, callback: @escaping InAppProductRequestCallback) -> InAppProductQueryRequest
+}
+
+class InAppProductQueryRetriever: InAppProductRetriever {
+    
+    func retrieveProducts(productIds: Set<String>, 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<String>, callback: @escaping RequestCallback) {
+    init(productIds: Set<String>, 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<String>, callback: @escaping RequestCallback) -> InAppProductQueryRequest {
-        let request = InAppProductQueryRequest(productIds: productIds, callback: callback)
-        request.start()
-        return request
-    }
-
     func start() {
         request.start()
     }

+ 7 - 2
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<String>, 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 {