Tom
Tom

Reputation: 4033

Add activity indicator inside of non view controller class

I have the following code for in-app purchases. Since somehow there is a delay as soon as purchase() is executed, I need to indicate that the app is loading. - How can I add an activity indicator as soon as the function purchase() is called?

I've already tried to add a subview with an indicator to the current view controller inside of the given function, but I failed.

class IAPService: NSObject {

    ...

    func purchase() {
        guard let productToPurchase = products.first else { return }
        print(productToPurchase)
        let payment = SKPayment(product: productToPurchase)
        paymentQueue.add(payment)
    }

    func restorePurchases() {
        paymentQueue.restoreCompletedTransactions()
    }

}

extension IAPService: SKProductsRequestDelegate {

    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        self.products = response.products
        for product in response.products {
            print(product.localizedTitle)
        }
    }

}

extension IAPService: SKPaymentTransactionObserver {

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            print(transaction.transactionState.status(), transaction.payment.productIdentifier)
            if transaction.payment.productIdentifier == "com.timfuhrmann.savum.premium" && ( transaction.transactionState == .purchased || transaction.transactionState == .restored ) {
                premiumPurchased = true
                defaults.set(premiumPurchased, forKey: "premiumPurchased")
                print(premiumPurchased)
            }
            switch transaction.transactionState {
            case .purchasing: break
            case .purchased: goToAddCar(); queue.finishTransaction(transaction)
            default: queue.finishTransaction(transaction)
            }
        }
    }

}

Upvotes: 1

Views: 86

Answers (2)

swifty
swifty

Reputation: 1151

You can show an activity indicator in the ViewController before that function is called and include a completion handler in the function where you dismiss the activity indicator in the ViewController when the purchase is completed.

You should add the activity indicator inside the ViewController, not from a function that is in you payments module, since the payment module is responsible only for making and processing payments.

Upvotes: 1

GntlmnBndt
GntlmnBndt

Reputation: 259

As a class, IAPService should not care, or even know, about the user interface. The activity indicator should be initiated and controlled entirely by the view controller.

I would use NotificationCenter observers to let the view controller know when the transaction is complete (or errors out) so the VC knows when to disable the activity indicator and update the rest of the UI.

Upvotes: 3

Related Questions