Swift 3 GCD和Parse

时间:2017-05-11 21:07:35

标签: swift asynchronous parse-platform

我对如何实现这一点感到困惑。

我想调用一个函数(func1)来调用func2,它执行一些Parse查询并将它们提交给数据库。

一旦所有这些查询完成并且func2完全运行,我想运行func3,它将执行类似的任务。

我想在func3完全运行后更新我的tableView但是我没有运气使用GCD。

我的问题是当我调用func1()然后等待组完成tableview重载数据函数在func3执行之前执行。

解决这个问题的最佳方法是什么?

 let group = DispatchGroup()
 let queue1 = DispatchQueue()
 let queue2 = DispatchQueue() 
 let queue3 = DispatchQueue()

 func1(){
     queue1.async(group: group){
        for i in 0...10 {
            func2(i)
        }
     }

     group.notify(queue: queue2){
        func3()
     }
 }

 func2(i: Int){
      queue2.async(group: group){
           // Perform query for value i
           PFQuery.findObjectsInBackground {}
      }
 }


func3(){
     queue3.async(group: group){
        PFQuery.findObjectsInBackground {}
     }
}


func1()
group.notify(queue: queue4){
    tableView.reloadData()
}

简化:

  1. func1()在for循环中多次调用func2()。
  2. 所有func2()调用必须在func3()开始之前完成
  3. func3()必须在tableview重新加载之前完成。

3 个答案:

答案 0 :(得分:1)

您是否应该为所有异步计算创建一个类似于组合的方法。这使得控制变得容易。是的,您应该在最后一次通话后拨打通知。

while True:  
    try: 
        humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
        if humidity is not None and temperature is not None:
            datos = {'temperatura': 'temperature', 'humedad': 'humidity', 'raspid': 'raspid'}
            r = requests.post("http://httpbin.org/post", data=datos)
            print(r.text)
        else:
            print ('Error de lectura!')
            time.sleep(15)
            sys.exit(1)
    except ConnectionError:
      continue

我认为func1,func2 func3 ...也在自己的队列中执行一些异步操作,并在完成处理程序中返回结果。我更喜欢在这样的情况下进入和离开调度组的变体,这样你可以更好地控制。

答案 1 :(得分:0)

这是我第一次尝试这个信息:

  
      
  • func1()在for循环中多次调用func2()。
  •   
  • 所有func2()调用必须在func3()开始之前完成
  •   
  • func3()必须在tableview重新加载之前完成。
  •   
func1() {
    let group = DispatchGroup()

    for element in elements {
        group.enter()
        func2(element, completion: { group.leave() })
    }

    group.await()

    func3(completion: {tableview.reload() })
}

答案 2 :(得分:-1)

func func1() {

    // Call func 2 and give it a block of work to execute when it is done
    func2(completionHandler: {
        // call func3 and give it a block of work to do when it is done
        func3(completionHandler: {
            // call back to the main thread to update the table
            update_my_table()
        }
    })
}

func func2(completionHandler: () -> void) {
    PFQuery.findObjectsInBackground()

    ... other work that must be done before func3 ...

    // execute work that should be done when func2 completes
    completionHandler()
}

func func3(completionHandler: () -> void) {
    ... do some stuff to prepare table data ...

    // execute work that must be done when func 3 completes
    completionHandler()
}

func update_my_table() {
    DispatchQueue.main.async {
        tableView.reloadData()
    }
}