Как выполнить 2 функции одновременно при обновлении интерфейса - PullRequest
0 голосов
/ 22 марта 2019

Я реализую In App purchases, которые работают довольно хорошо. Я использую подписки Auto-Renewable и Non-renewable. Я могу определить, когда любая из подписок активна и срок ее действия истек. Я могу обновить пользовательский интерфейс профиля в соответствии со статусом подписки, но могу сделать это только при проверке по одному за раз.

Если я позвоню обоим functions, когда представление должно появиться. Пользовательский интерфейс испорчен и не отображает правильный статус. Я отладил и увидел, что если первый проверяет одну подписку, обновляет ее статус, когда я выхожу из view и возвращаюсь, он проверяет, что другой возвращается к статусу по умолчанию, который равен standard account, поскольку Auto-renewable истек , Есть ли способ запустить обе функции одновременно, а также использовать их для обновления моего интерфейса одновременно. Ниже мой код.

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

1 Ответ

1 голос
/ 22 марта 2019

Вам нужно использовать DispatchGroup, а внутри его уведомляющая часть делать то, что вам нужно

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

А внутри viewDidLoad

checkForAutoRenewableSubscription()
checkForNonRenewableSubscription() 
dispatchGroup.notify(queue: .main) { 
   self.setUpUserAccountStatus()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...