从API获取计数值后更新应用程序图标徽章编号

时间:2019-01-29 22:55:08

标签: ios swift badge

我想通过总计所有徽章计数来更新应用程序图标徽章编号。以下是我的功能。问题是计数不同步,因为我要从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!
        }
    }

}

在函数上方调用

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 :(得分:1)

这两个值是通过单独的异步调用获取的,因此它们将在不同的时间返回。

您可以将这两个值存储在视图控制器变量中,并使用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是否为nil。根据您的数据,您可能需要以不同的方式处理它。例如,您可能需要将result.data强制转换为特定类型。

答案 1 :(得分:1)

如果您还没有弄清楚,那么这里是一种解决方案。您可以在嵌套函数中实现它。像这样

func updateValues() {
    fetchValue1() { (result, error) in
        fetchValue2() { (result, error) in
            // update all badges numbers here
        }
    }
}