Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 更新UI时如何同时执行2个功能_Ios_Swift_Multithreading_In App Purchase - Fatal编程技术网

Ios 更新UI时如何同时执行2个功能

Ios 更新UI时如何同时执行2个功能,ios,swift,multithreading,in-app-purchase,Ios,Swift,Multithreading,In App Purchase,我正在实施应用内购买,效果非常好。我正在实施自动续费和不续费订阅。我可以确定任一订阅何时处于活动状态,何时过期。我可以根据订阅状态更新用户配置文件UI,但只能在每次选中一个时更新 如果我在视图即将出现时调用这两个函数。用户界面混乱,无法显示正确的状态。我已经调试并看到,如果第一个检查一个订阅,更新其状态,当我移出视图并返回时,它会检查另一个返回默认状态,即标准帐户,因为自动续费已过期。是否有一种方法可以同时运行这两个函数并同时使用它们更新UI。下面是我的代码 var isUserActive:

我正在实施应用内购买,效果非常好。我正在实施自动续费和不续费订阅。我可以确定任一订阅何时处于活动状态,何时过期。我可以根据订阅状态更新用户配置文件UI,但只能在每次选中一个时更新

如果我在视图即将出现时调用这两个函数。用户界面混乱,无法显示正确的状态。我已经调试并看到,如果第一个检查一个订阅,更新其状态,当我移出视图并返回时,它会检查另一个返回默认状态,即标准帐户,因为自动续费已过期。是否有一种方法可以同时运行这两个函数并同时使用它们更新UI。下面是我的代码

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()
}