我正在尝试在我的移动应用程序中对一个非常大的数组进行排序。我正在使用 SwiftUI,并希望在用户点击按钮后对数组进行排序。这种排序可能需要大约 3 秒,所以我希望这发生在主队列之外。但是,即使调用代码发生在global
async
块上,它似乎仍然发生在线程 1 上并减慢了我的 UI 速度。在此期间,CPU 峰值达到 100%,UI 无响应。
Button("Sort List") {
DispatchQueue.global(qos: .background).async {
self.updateList()
}
}
...
func updateList() {
//have tried putting the queue here as well
var sorted: [OBJ] = []
for obj in self.allObjs {
for i in 0..<self.selected.count {
...
let i = sorted.insertionIndexOf(obj, isOrderedBefore: self.sorter)
sorted.insert(obj, at: i)
}
}
self.someStateVar = sorted
}
你确定这部分代码做了你想做的事情吗?
var sorted: [OBJ] = []
for obj in self.allObjs {
for i in 0..<self.selected.count {
...
let i = sorted.insertionIndexOf(obj, isOrderedBefore: self.sorter)
sorted.insert(obj, at: i)
}
}
对我来说,这看起来有点奇怪:-(
OBJ
是什么类型?- 所选是某个模型或状态的一部分吗?它与UI有关吗?
- 排序是空数组吗?
insertionIndexOf(obj, isOrderedBefore: self.sorter)
?这个函数从何而来?它是自定义排序算法的一部分吗?- 你真的想重新定义
i
吗?如果是,i
(作为循环中的参数(在哪里使用,用途是什么?
我知道这不是一个答案,但有很多问题:-(。如果您需要答案,请以这种方式重写您的问题,我们可以在我们的环境中运行和玩耍。
尝试以下显式重定向到主队列。
注意:提供更多的代码将允许执行更好的分析
func updateList() {
//have tried putting the queue here as well
var sorted: [OBJ] = []
for obj in self.allObjs {
for i in 0..<self.selected.count {
...
let i = sorted.insertionIndexOf(obj, isOrderedBefore: self.sorter)
sorted.insert(obj, at: i)
}
}
DispatchQueue.main.async {
self.someStateVar = sorted // update on main queue
}
}