在 Swift 开始耗时任务之前应更改界面
Interface should be changed before time-consuming task starts in Swift
我正在尝试实现 collectionView 单元格的以下行为:通过点击单元格,应该首先更改单元格的外观!之后,应该开始一个耗时的过程:
@objc private func addItemsToBasket(_ button: UIButton) {
button.setTitleColor(.clear, for: .normal)
Basket.addItems(keys: planner.currentDayKeys())
}
但不幸的是,只有在耗时的块完成后,单元格才会改变外观。如果我评论“Basket.addItems(keys: planner.currentDayKeys())”,单元格会更改其外观提示。
我已经在 GCD 中尝试了不同的选项,但没有任何帮助。但实际上,如果我不定义队列,代码应该 运行 逐行。对吗?
应该是很常见的情况。
预先感谢您的任何想法。
如评论中所述,您不应在主队列上执行耗时任务。在这种情况下,GCD 肯定会帮助你。你有没有尝试过这样的事情:
@objc private func addItemsToBasket(_ button: UIButton) {
button.setTitleColor(.clear, for: .normal)
DispatchQueue.global.async {
Basket.addItems(keys: self.planner.currentDayKeys())
}
}
但是您需要确保,如果您在 Basket.addItems
中做了一些 UI 更改,您需要通过将它们包装在 DispatchQueue.main.async
闭包中将它们分派回 main。
我正在尝试实现 collectionView 单元格的以下行为:通过点击单元格,应该首先更改单元格的外观!之后,应该开始一个耗时的过程:
@objc private func addItemsToBasket(_ button: UIButton) {
button.setTitleColor(.clear, for: .normal)
Basket.addItems(keys: planner.currentDayKeys())
}
但不幸的是,只有在耗时的块完成后,单元格才会改变外观。如果我评论“Basket.addItems(keys: planner.currentDayKeys())”,单元格会更改其外观提示。
我已经在 GCD 中尝试了不同的选项,但没有任何帮助。但实际上,如果我不定义队列,代码应该 运行 逐行。对吗?
应该是很常见的情况。 预先感谢您的任何想法。
如评论中所述,您不应在主队列上执行耗时任务。在这种情况下,GCD 肯定会帮助你。你有没有尝试过这样的事情:
@objc private func addItemsToBasket(_ button: UIButton) {
button.setTitleColor(.clear, for: .normal)
DispatchQueue.global.async {
Basket.addItems(keys: self.planner.currentDayKeys())
}
}
但是您需要确保,如果您在 Basket.addItems
中做了一些 UI 更改,您需要通过将它们包装在 DispatchQueue.main.async
闭包中将它们分派回 main。