异步 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 在主队列上调度的。没有必要使用任何其他类型的同步。