Ios 更新UI时如何同时执行2个功能
我正在实施应用内购买,效果非常好。我正在实施自动续费和不续费订阅。我可以确定任一订阅何时处于活动状态,何时过期。我可以根据订阅状态更新用户配置文件UI,但只能在每次选中一个时更新 如果我在视图即将出现时调用这两个函数。用户界面混乱,无法显示正确的状态。我已经调试并看到,如果第一个检查一个订阅,更新其状态,当我移出视图并返回时,它会检查另一个返回默认状态,即标准帐户,因为自动续费已过期。是否有一种方法可以同时运行这两个函数并同时使用它们更新UI。下面是我的代码Ios 更新UI时如何同时执行2个功能,ios,swift,multithreading,in-app-purchase,Ios,Swift,Multithreading,In App Purchase,我正在实施应用内购买,效果非常好。我正在实施自动续费和不续费订阅。我可以确定任一订阅何时处于活动状态,何时过期。我可以根据订阅状态更新用户配置文件UI,但只能在每次选中一个时更新 如果我在视图即将出现时调用这两个函数。用户界面混乱,无法显示正确的状态。我已经调试并看到,如果第一个检查一个订阅,更新其状态,当我移出视图并返回时,它会检查另一个返回默认状态,即标准帐户,因为自动续费已过期。是否有一种方法可以同时运行这两个函数并同时使用它们更新UI。下面是我的代码 var isUserActive:
var isUserActive: Bool?
var user: User {
return AppDelegate.shared.user
}
func setUserAccountType() {
if self.isUserActive == nil {
self.userAccountType.text = ""
self.userGoGold.isHidden = true
} else {
if self.isUserActive! {
self.userAccountType.text = "Gold Account"
} else {
self.userAccountType.text = "Standard Account"
self.userGoGold.isHidden = false
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.setUserAccountType()
IAPManager.shared.getProducts()
}
override func viewWillAppear(_ pAnimated: Bool) {
super.viewWillAppear(pAnimated)
self.checkForAutoRenewableSubscription()
self.checkForNonRenewableSubscription()
}
func setUpUserAccountStatus(_ pIsActive: Bool) {
DispatchQueue.main.async {
self.isUserActive = pIsActive
self.setUserAccountType()
self.reloadRowForIdentifier(.billing)
self.activityIndicator.hidesWhenStopped = true
self.activityIndicator.stopAnimating()
}
}
func checkForAutoRenewableSubscription() {
self.activityIndicator.startAnimating()
self.user.checkIfSubscriptionIsActive { (pIsActive) in
self.setUpUserAccountStatus(pIsActive)
}
}
func checkForNonRenewableSubscription() {
self.activityIndicator.startAnimating()
self.user.checkifNonRenewableSubscriptionIsActive { (pSubscribed) in
self.setUpUserAccountStatus(pSubscribed)
}
}
您需要使用DispatchGroup,并在它的notify部分中执行您需要的操作
let dispatchGroup = DispatchGroup()
var inpIsActive = false
var inpSubscribed = false
func checkForAutoRenewableSubscription() {
dispatchGroup.enter()
self.activityIndicator.startAnimating()
self.user.checkIfSubscriptionIsActive { (pIsActive) in
self.inpIsActive = pIsActive
self.dispatchGroup.leave()
}
}
func checkForNonRenewableSubscription() {
dispatchGroup.enter()
self.activityIndicator.startAnimating()
self.user.checkifNonRenewableSubscriptionIsActive { (pSubscribed) in
self.inpSubscribed = pSubscribed
self.dispatchGroup.leave()
}
}
和内部视图加载
在何处运行dispatchGroup.notifyqueue:.main。视图将出现或?self.setUpUserAccountStatuspIsActive:Bool有一个Bool参数。你把它处理掉了吗?。因为当它要求一个?从函数中删除它,现在您的订阅有2个布尔值打印出消息两个函数都已完成,但UI现在根本不出现。setUpUserAccountStatus中的所有空白NowInner使用应答中添加的2个bool值进行配置
checkForAutoRenewableSubscription()
checkForNonRenewableSubscription()
dispatchGroup.notify(queue: .main) {
self.setUpUserAccountStatus()
}