SwiftUI 全局队列在线程 1 上运行



我正在尝试在我的移动应用程序中对一个非常大的数组进行排序。我正在使用 SwiftUI,并希望在用户点击按钮后对数组进行排序。这种排序可能需要大约 3 秒,所以我希望这发生在主队列之外。但是,即使调用代码发生在globalasync块上,它似乎仍然发生在线程 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)
}
}

对我来说,这看起来有点奇怪:-(

  1. OBJ是什么类型?
  2. 所选是某个模型或状态的一部分吗?它与UI有关吗?
  3. 排序是空数组吗?
  4. insertionIndexOf(obj, isOrderedBefore: self.sorter)?这个函数从何而来?它是自定义排序算法的一部分吗?
  5. 你真的想重新定义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
}
}

最新更新