2012-07-21 19 views
0

我的情况是,每当我的应用程序变得活跃时,我需要同步Facebook上的一些数据。这个同步应该在后台进行,不应该锁定GUI(因此它不应该在主队列上运行)。iOS - 在GCD背景下下载Facebook数据

所以在我- applicationDidBecomeActive:方法我有这样的代码:

dispatch_async(dispatch_get_global_queue(0,0), ^{ 

    [[FacebookHelper sharedInstance] syncData]; 
}); 

FacebookHelper是一个单独的类,它的所有的Facebook小心处理。在FacebookHelper类中,我实现了Facebook委托方法。但由于某种原因,当我运行上面的代码时,Facebook委托方法- request:didLoad:(当Facebook数据完成下载时)永远不会被调用。虽然如果我使用dispatch_sync运行相同的代码,它将完成(但是然后GUI将被阻止)。

编辑:Facebook的SDK V2

+0

可能你的背景队列被锁定了吗?由于你在队列中,你的用户界面将继续发挥作用,但是你的后台任务可能无法取得任何进展。 – nielsbot 2012-07-21 18:48:21

+0

有可能你的后台线程在任何回调尝试之前完成 - 如果是这样的话,你需要在runloop中完成这项工作,而不仅仅是一个线程。显然,我不知道你确切的例子,但这是一个标准的问题,像在后台队列上运行网络传输一样。 – ChrisH 2012-07-21 20:03:46

回答

0

实际分析的代码后,我发现这是这是在- request:didLoad:委托方法做了内部处理方法。所以我只是把这个内部处理方法放在一个dispatch_async块中,并且它在后台很好地执行。

感谢您的帮助!