我已经弄明白了这个问题的答案,但我想我应该把问题和答案贴出来,因为我花了很长时间才弄明白。
我在我的应用程序中使用Google Drive iOS/Objective C API (参见https://developers.google.com/drive/ios/quickstart)已经有一段时间了。一切都进行得很顺利。在过去的几天里,我试图扩展我对它的使用,在我的新使用中,作为我正在做的事情的一部分,我希望Google API访问发生在后台,而不是阻碍UI。因此,我将调用分派给Google API,如下所示:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
// Call Google Drive
});
结果好坏参半。我得到了部分结果。看起来,在我重新启动我的应用程序之前,它会一直工作,然后它就会停止。尽管我仍然拥有用户授权凭证。
发布于 2015-01-11 07:19:56
让漫长的调试过程变得简短(我尝试了我所做的每一件事),我最终将其范围缩小到线程问题。在主线程上运行Google API调用(这是我在最初使用Google API时所做的),事情就开始工作了。我在谷歌文档中发现:
通常,应用程序将在主线程上执行查询,查询完成处理程序将在主线程上回调。
或者,应用程序可以在后台线程上执行查询,并将在同一后台线程上被回调,尽管应用程序必须在该线程上运行NSRunLoop才能进行回调。
请参阅https://code.google.com/p/google-api-objectivec-client/wiki/Introduction
下面的文字也很重要:
从iOS 6和MacOSX10.7开始,查询可以在主线程或后台线程上执行,并在主线程或后台线程上回调。要使回调发生在与执行查询的线程不同的线程上,请为服务对象的delegateQueue属性指定一个NSOperationQueue (而不是调度队列)。
例如,通过使用主队列,可以在主线程上回调来自任何线程的查询:
service.delegateQueue = NSOperationQueue mainQueue;通过提供后台队列,可以在后台线程上回调来自任何线程的查询,如下例所示:
service.delegateQueue = [NSOperationQueue alloc ];指定委托队列时,不需要在执行查询的线程上运行运行循环。
https://stackoverflow.com/questions/27884875
复制相似问题