0

Objective-C 用のGoogle API クライアント ライブラリ(GTL) を使用してGoogle Drive APIにアクセスしています。

それのIntroduction to the Google APIs Client Library for Objective-Cによると、

サービスによるクエリの実行は、本質的に非同期です。

つまり、次のようなパスを作成しようとすると、root/a/b/cfolder を作成する前に、次のことを行うb必要があります。

  1. が作成されていることを確認してください。そうでない場合は、確認しようとするa前に作成してください。bparentRef

  2. idフォルダを知って、その中にa作成できるようbにします。

も同様cです。

次のようなものを使用してid、既知の親フォルダー ID 内の名前でフォルダーを取得します。

    // Get parentID by name "parent".

    let query = GTLQueryDrive.queryForChildrenListWithFolderId(parentID)
    query.q = "mimeType='application/vnd.google-apps.folder' and '\(parentID)' in parents and trashed=false and title='\(name)'"

    query.maxResults = 1

    GTLFileTicket = GTLDriveService.executeQuery(
        query,
        completionHandler: {(
            ticket:         GTLServiceTicket!,
            object:         AnyObject!,
            error:          NSError!) -> Void in

            // Callback
            self.GTLFileTicket = nil
            if error == nil {
                // Get the id from the object. If nil make another query to create a folder named "name" within folder "parentID".
            } else {
                // error handles here.
            }
    })

プロジェクトの他の部分では、for ループ内で上記のメソッドを呼び出しました。

var parent = "root"
for item in array {
    createFolderIfNotExisted(item, parent: parent)
    parent = item
}

どうやら、最初のクエリが終了する前に2番目のクエリが開始されるため、失敗して最初のフォルダーのみを作成することになります。私はグーグルで調べましたが、代わりに同期呼び出しにする方法がわかりませんでした。(Java APIブランチには次のようなものがあるのを見ました.await()か?)

呼び出しを順番に実行できるようにする方法はありますか?

4

1 に答える 1

0

同期 for ループの使用は避けてください。createFolder 関数は、完了時にコールバックする必要があります。そのコールバックは次のループ反復を開始する必要があります。

于 2015-06-15T04:29:22.207 に答える