【问题标题】:Why did the Google Drive iOS API stop running in my app?为什么 Google Drive iOS API 停止在我的应用中运行?
【发布时间】:2015-01-11 07:17:36
【问题描述】:

我已经想出了这个问题的答案,但我想我会发布问题和答案,因为我花了很长时间才弄明白。

一段时间以来,我一直在我的应用程序中使用 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
        });

结果好坏参半。我得到了部分结果。看起来,在我重新启动我的应用程序之前它会起作用,然后它就会停止。尽管我仍然拥有用户授权凭据。

【问题讨论】:

    标签: ios google-drive-api


    【解决方案1】:

    缩短了一个漫长的调试过程(我尝试了我改变的最后一件事),我最终将其缩小为线程问题。在主线程上运行 Google API 调用(我在最初使用 Google API 时一直在这样做),事情开始起作用了。我在 Google 文档中找到:

    通常,应用程序将在主线程上执行查询,并且 查询完成处理程序将在主线程上回调。

    或者,应用程序可以在后台执行查询 线程并将在同一个后台线程上被回调,不过 应用程序必须在该线程上为回调运行 NSRunLoop 发生。

    https://code.google.com/p/google-api-objectivec-client/wiki/Introduction

    以下文字也很重要:

    从 iOS 6 和 Mac OS X 10.7 开始,可以在 主线程或后台线程,并被回调 主线程或后台线程。发生回调 在与执行查询不同的线程上,指定一个 服务对象的 NSOperationQueue(不是调度队列) 委托队列属性。

    例如,从任何线程发出的查询都可以在 使用主队列的主线程:

    service.delegateQueue = [NSOperationQueue mainQueue];提出的查询 从任何线程都可以通过提供在后台线程上回调 一个后台队列,如本例所示:

    service.delegateQueue = [[NSOperationQueue alloc] init];当一个 指定了委托队列,不需要运行循环 在执行查询的线程上运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 2020-10-28
      相关资源
      最近更新 更多