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