ios - 在非视图控制器类中添加活动指示器
问题描述
我有以下用于应用内购买的代码。由于不知何故一旦purchase()
执行就会有延迟,我需要指出应用程序正在加载。-如何在purchase()
调用函数后立即添加活动指示器?
我已经尝试在给定函数内的当前视图控制器中添加一个带有指示器的子视图,但我失败了。
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)
}
}
}
}
解决方案
作为一个类,IAPService 不应该关心甚至不知道用户界面。活动指示器应该完全由视图控制器启动和控制。
我会使用 NotificationCenter 观察者让视图控制器知道事务何时完成(或出错),以便 VC 知道何时禁用活动指示器并更新 UI 的其余部分。
推荐阅读
- android - Android Volley Execution 抛出异常:无法解析的日期
- database - 多线程VB.net:更新然后返回行ID?
- kubernetes - Kubernetes cronjobs `startingDeadlineSeconds` 到底是什么意思?
- vue.js - 了解 Vue 项目的结构 (vuetify)
- ruby - Selenium with Ruby:使用 2 个字段处理 JS 提示
- apache-poi - 使用 Apache POI 下载 word 文档会生成损坏的文档
- php - Prestashop 1.7 - 注册后向客户发送第二封电子邮件
- statistics - Logistc 回归 - 偏差的变化
- css - 以百分比表示的按钮高度使其平坦
- cucumber - cucumber-js:指定步骤定义文件的路径