所以我的目标是基本上在while循环中执行查询并将查询结果附加到我的数组。当我运行代码时,我的“level”变量从零开始并无限增加。我非常确信我的问题是由于我的代码在2个异步队列上运行,但却无法找出确切的原因。
func displayPathOf(argument:Argument,threadTableView:UITableView){
array.removeAll()
threadTableView.reloadData()
var level = argument.level!-1
array.insert(argument, at: 0)
var stop = false
DispatchQueue.global(qos: .userInteractive).async {
repeat {
level += 1
print(level)
let query = Argument.query()?.whereKey("level", equalTo: level).addDescendingOrder("reach")
query?.getFirstObjectInBackground(block: { (object, error) in
if object != nil {
DispatchQueue.main.async {
array.append(object as! Argument)
print(array)
threadTableView.reloadData()}
} else {
stop = true
print(error)
}
})
} while stop == false
}
}
答案 0 :(得分:0)
您的代码归结为:
do-in-background {
repeat {
level += 1
do-in-background { ... }
} while stop == false
}
do-in-background
(即async
和getFirstObjectInBackground
)都会立即返回,所以从这个循环的角度来看,它并不重要。块。这相当于一个紧凑的循环递增级别,尽可能快。
您似乎正在尝试将您的来电序列化为getFirstObjectInBackground
。您可以采取以下两种方式之一:
repeat
循环。DispatchGroup
等待完成块完成。在你的情况下,我可能会推荐第一个。摆脱stop
并使某个函数(模糊地)像:
func fetchObject(at level: Int) {
let query = Argument.query()?.whereKey("level", equalTo: level).addDescendingOrder("reach")
query?.getFirstObjectInBackground(block: { (object, error) in
if let object = object {
DispatchQueue.main.async {
array.append(object as! Argument)
print(array)
threadTableView.reloadData()}
// Schedule the next loop
DispatchQueue.global(qos: .userInteractive).async { fetchObject(level + 1) }
} else {
print(error)
}
})
}