我对如何实现这一点感到困惑。
我想调用一个函数(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()
}
简化:
答案 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()
}
}