Skip to content

Commit

Permalink
Dependency injection for ProductsInfoController
Browse files Browse the repository at this point in the history
  • Loading branch information
bizz84 committed Aug 21, 2017
1 parent 2333174 commit 1e73de5
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 11 deletions.
26 changes: 17 additions & 9 deletions SwiftyStoreKit/InAppProductQueryRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,29 +24,37 @@

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)
super.init()
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()
}
Expand Down
9 changes: 7 additions & 2 deletions SwiftyStoreKit/ProductsInfoController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 {
Expand Down

0 comments on commit 1e73de5

Please sign in to comment.