Swift 关闭信号量等待 Facebook 图查询
Swift Closure semaphore wait for Facebook graph query
我正在执行 Facebook 图查询以从用户个人资料中提取信息。该调用由 Facebook 登录按钮 (UIView) 触发,因此我需要等待它完成才能继续。我添加了一些日志记录,在我看来图形请求是异步的?我想在使用它来填充我的内部 User
对象时同步调用它。
var semaphore = dispatch_semaphore_create(0)
let request = FBSDKGraphRequest(graphPath: "me", parameters: nil)
request.startWithCompletionHandler({
(connection, result, error) -> Void in
if error != nil {
//handle error
} else {
//extract info from result
}
dispatch_semaphore_signal(semaphore)
})
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
为了等待 Facebook 调用完成,我使用 GCD 添加了一个信号量等待,但现在我从未在处理程序中遇到断点。我只是永远等待;看来我造成了僵局。
同步 运行 异步闭包的正确方法是什么?我可以只设置一个标志并设置一个空循环,但我宁愿避免这样的黑客攻击。
我认为您采用的方法不正确。与其让异步任务同步,不如让 UI 等待响应。最普遍的做法是使用 HUD 让用户知道应用程序正在做某事,从而解释无响应 UI。
您有许多 HUD 库,您可以开箱即用,也可以设计自己的库。这是一个在 Obj-c 中使用流行的 SVProgressHUD 的示例,但在 swift:
中也是如此
[SVProgressHUD show]; // This will block the UI
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Your async task here
dispatch_async(dispatch_get_main_queue(), ^{
//your async task is finished
[SVProgressHUD dismiss]; // this will free up the UI
});
});
我正在执行 Facebook 图查询以从用户个人资料中提取信息。该调用由 Facebook 登录按钮 (UIView) 触发,因此我需要等待它完成才能继续。我添加了一些日志记录,在我看来图形请求是异步的?我想在使用它来填充我的内部 User
对象时同步调用它。
var semaphore = dispatch_semaphore_create(0)
let request = FBSDKGraphRequest(graphPath: "me", parameters: nil)
request.startWithCompletionHandler({
(connection, result, error) -> Void in
if error != nil {
//handle error
} else {
//extract info from result
}
dispatch_semaphore_signal(semaphore)
})
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
为了等待 Facebook 调用完成,我使用 GCD 添加了一个信号量等待,但现在我从未在处理程序中遇到断点。我只是永远等待;看来我造成了僵局。
同步 运行 异步闭包的正确方法是什么?我可以只设置一个标志并设置一个空循环,但我宁愿避免这样的黑客攻击。
我认为您采用的方法不正确。与其让异步任务同步,不如让 UI 等待响应。最普遍的做法是使用 HUD 让用户知道应用程序正在做某事,从而解释无响应 UI。
您有许多 HUD 库,您可以开箱即用,也可以设计自己的库。这是一个在 Obj-c 中使用流行的 SVProgressHUD 的示例,但在 swift:
中也是如此[SVProgressHUD show]; // This will block the UI
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Your async task here
dispatch_async(dispatch_get_main_queue(), ^{
//your async task is finished
[SVProgressHUD dismiss]; // this will free up the UI
});
});