异步 Web 服务调用的调度队列
Dispatch Queues for Asynchronous Web Service Call
我正在调用 Facebook Graph API 以获取通过 Facebook 登录我的应用程序的用户的电子邮件、Facebook ID 和名称。
获取信息成功;我现在正在尝试使用调度组,以便调用图形的函数在返回之前等待图形 API 调用完成。图请求是异步的。
我不明白为什么这段代码会被锁定。
1) 创建调度组
2) 进入显示组
3) 检索到信息或发现错误后离开群组
4) 等团走再回来
似乎我的派遣组输入调用不正确,但我不明白为什么。
class func getFBInformation()->Bool {
var fbResult = false
let fbGraphGroup = DispatchGroup()
fbGraphGroup.enter()
FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, email"]).start { (connection, result, err) in
if err != nil {
fbResult = false
print("Pre Error Signal")
fbGraphGroup.leave()
return
}
if let resultDict = result as? [String:AnyObject] {
<Do things with graph results>
print("Pre success signal")
fbResult = true
fbGraphGroup.leave()
}
}
fbGraphGroup.wait()
print("Post signal")
return fbResult
}
它是如何工作的?
首先你进入组,接下来你在主线程上等待完成处理程序直到它离开组。但是完成处理程序无法在主线程上执行才能离开组。
据我所知,您的完成处理程序是由 API 在主队列上调度的。没有必要使用任何其他类型的同步。
我正在调用 Facebook Graph API 以获取通过 Facebook 登录我的应用程序的用户的电子邮件、Facebook ID 和名称。
获取信息成功;我现在正在尝试使用调度组,以便调用图形的函数在返回之前等待图形 API 调用完成。图请求是异步的。
我不明白为什么这段代码会被锁定。
1) 创建调度组
2) 进入显示组
3) 检索到信息或发现错误后离开群组
4) 等团走再回来
似乎我的派遣组输入调用不正确,但我不明白为什么。
class func getFBInformation()->Bool {
var fbResult = false
let fbGraphGroup = DispatchGroup()
fbGraphGroup.enter()
FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, email"]).start { (connection, result, err) in
if err != nil {
fbResult = false
print("Pre Error Signal")
fbGraphGroup.leave()
return
}
if let resultDict = result as? [String:AnyObject] {
<Do things with graph results>
print("Pre success signal")
fbResult = true
fbGraphGroup.leave()
}
}
fbGraphGroup.wait()
print("Post signal")
return fbResult
}
它是如何工作的? 首先你进入组,接下来你在主线程上等待完成处理程序直到它离开组。但是完成处理程序无法在主线程上执行才能离开组。
据我所知,您的完成处理程序是由 API 在主队列上调度的。没有必要使用任何其他类型的同步。