循环中的异步DispatchQueue

时间:2017-03-13 01:37:57

标签: swift asynchronous parse-platform grand-central-dispatch dispatch-async

  

所以我的目标是基本上在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
    }
}

1 个答案:

答案 0 :(得分:0)

您的代码归结为:

do-in-background {
    repeat {
        level += 1
        do-in-background { ... }
    } while stop == false
}

do-in-background(即asyncgetFirstObjectInBackground)都会立即返回,所以从这个循环的角度来看,它并不重要。块。这相当于一个紧凑的循环递增级别,尽可能快。

您似乎正在尝试将您的来电序列化为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)
        }
    })
}