Обновить номер значка приложения после получения значения счетчика из API - PullRequest
0 голосов
/ 30 января 2019

Я хочу обновить номер значка приложения, суммируя все количество значков.Следующее - моя функция.Проблема в том, что счетчик не синхронизирован, так как я получаю значения счетчика из API, а замыкания делают его не синхронизированным.updateBadgeCounts () будет вызываться много раз во время использования приложения.

Как мне заставить это работать?

extension UIViewController {

    func updateBadgeCounts() {
        fetchValue1() { (result, error) in
            UIApplication.shared.applicationIconBadgeNumber = result!.data!.count!
        }

        fetchValue2() { (result, error) in
           UIApplication.shared.applicationIconBadgeNumber += result!.data!.count!
        }
    }

}

Вызов выше func

class MainTabBarController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {

        // Do other stuff...

        DispatchQueue.main.async() {
            self.updateBadges()
        }

    }

    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        DispatchQueue.main.async() {
            self.updateBadges()
        }
    }

}

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Если вы еще не поняли, вот одно из решений.Вы можете реализовать это во вложенных функциях.Как то так

func updateValues() {
    fetchValue1() { (result, error) in
        fetchValue2() { (result, error) in
            // update all badges numbers here
        }
    }
}
0 голосов
/ 30 января 2019

Два значения выбираются отдельными асинхронными вызовами, поэтому они будут возвращаться в разное время.

Вы можете сохранить эти два значения в переменных контроллера представления и использовать didSet для обновления значка.

var value1: Int = 0 {
    didSet {
        updateBadge()
    }
}

var value2: Int = 0 {
    didSet {
        updateBadge()
    }
}

func updateBadge() {
    UIApplication.shared.applicationIconBadgeNumber = value1 + value2
}

func updateValues() {
    fetchValue1() { (result, error) in
        if let result = result {
            self.value1 = result.data!.count
        }
    }
    fetchValue2() { (result, error) in
        if let result = result {
            self.value2 = result.data!.count
        }
    }
}

В отдельной заметке я добавил необязательную привязку для проверки result не ноль.В зависимости от ваших данных, вам может потребоваться обрабатывать их по-разному.Например, вам может потребоваться привести ваш result.data к определенному типу.

...