gpt4 book ai didi

ios - 使用dispatch_group_async从嵌套异步调用获取通知

转载 作者:行者123 更新时间:2023-12-02 03:12:39 25 4
gpt4 key购买 nike

所以,当我想要做一些异步的事情时,我会遇到这样的情况:在 Facebook 上发布状态并在发布完成后收到通知。我本来希望dispatch_group_async能够完成这项工作,但现在我碰壁了。

这就是此时逻辑的样子。

功能

func saveAndPost() {
//1. save
dispatch_group_async(group, queue) { () -> Void in
print("saving to DB")
//some func
print("saved to DB")
}
//2. post
dispatch_group_async(group, queue, { () -> Void in
print("publishing on FB")
//some func
//async request to ACAccount {
print("access")
//async performRequestWithHandler{
print("posted")
//anwser from request
}
}
}
print("published on FB")
})

dispatch_group_notify(group, queue, { () -> Void in
print("done")
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//go to next view
})
})
}

输出

saving to DB
saved to DB
publishing on FB
published on FB
done
post
posted

我的目标是在整个发布过程完成后收到通知。也许这对于dispatch_group_async是不可能的,我必须使用KVO甚至PromiseKit?

解决方案

David 让我思考,dispatch_group_enter 和“dispatch_group_leave”正是我所需要的。所以此时我的逻辑是这样的。

func saveAndPost() {
//1. save
dispatch_group_async(group, queue) { () -> Void in
print("saving to DB")
//some func
print("saved to DB")
}
//2. post
dispatch_group_enter(group)
print("publishing on FB")
//some func
//async request to ACAccount {
print("access")
//async performRequestWithHandler{
print("posted")
//anwser from request
dispatch_group_leave(group)
}
}
}
print("published on FB")

dispatch_group_notify(group, queue, { () -> Void in
print("done")
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//go to next view
})
})
}

如您所见,2. 部分现已修改。

最佳答案

我在处理异步调用时解决这个问题的首选方法:

var asyncGroup = dispatch_group_create()

dispatch_group_enter(asyncGroup)
asyncCall1.start() {


//end of callback
dispatch_group_leave(asyncGroup)
}

dispatch_group_enter(asyncGroup)
asyncCall2.start() {

asyncCall3.start() {

asyncCall4.start() {

dispatch_group_leave(asyncGroup)
}

}
}

dispatch_group_notify(asyncGroup, dispatch_get_main_queue(), {
println("done")
})

asyncCall1.start() { ... }asyncCall2.start() { ... } 只是一些伪代码,向您展示它是如何工作的。

每个 dispatch_group_enter 调用都需要通过 dispatch_group_leave 调用来平衡,否则您将永远不会进入 dispatch_group_notify block 。

关于ios - 使用dispatch_group_async从嵌套异步调用获取通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32935462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com