快速关闭信号量等待Facebook图形查询



我正在执行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添加了一个信号量等待,但现在我从未在处理程序中遇到断点。我只是永远等待;看来我造成了僵局。

同步运行异步闭包的正确方法是什么?我可以设置一个标志并设置一个空循环,但我宁愿避免这样的hack。

我认为你的方法不对。您应该让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
    });
});
https://github.com/TransitApp/SVProgressHUD

最新更新