Quellcode durchsuchen

Keep track of multiple completion blocks for requests with the same set of product ids

Andrea Bizzotto vor 8 Jahren
Ursprung
Commit
2333174a75
1 geänderte Dateien mit 19 neuen und 5 gelöschten Zeilen
  1. 19 5
      SwiftyStoreKit/ProductsInfoController.swift

+ 19 - 5
SwiftyStoreKit/ProductsInfoController.swift

@@ -27,15 +27,29 @@ import StoreKit
 
 
 class ProductsInfoController: NSObject {
 class ProductsInfoController: NSObject {
 
 
+    struct InAppProductQuery {
+        let request: InAppProductQueryRequest
+        var completionHandlers: [InAppProductQueryRequest.RequestCallback]
+    }
+    
     // As we can have multiple inflight queries and purchases, we store them in a dictionary by product id
     // As we can have multiple inflight queries and purchases, we store them in a dictionary by product id
-    private var inflightQueries: [Set<String>: InAppProductQueryRequest] = [:]
+    private var inflightQueries: [Set<String>: InAppProductQuery] = [:]
 
 
     func retrieveProductsInfo(_ productIds: Set<String>, completion: @escaping (RetrieveResults) -> Void) {
     func retrieveProductsInfo(_ productIds: Set<String>, completion: @escaping (RetrieveResults) -> Void) {
 
 
-        inflightQueries[productIds] = InAppProductQueryRequest.startQuery(productIds) { result in
-            
-            self.inflightQueries[productIds] = nil
-            completion(result)
+        if inflightQueries[productIds] == nil {
+            let request = InAppProductQueryRequest.startQuery(productIds) { results in
+                
+                if let query = self.inflightQueries[productIds] {
+                    for completion in query.completionHandlers {
+                        completion(results)
+                    }
+                    self.inflightQueries[productIds] = nil
+                }
+            }
+            inflightQueries[productIds] = InAppProductQuery(request: request, completionHandlers: [completion])
+        } else {
+            inflightQueries[productIds]!.completionHandlers.append(completion)
         }
         }
     }
     }
 }
 }