Objective-C 用のGoogle API クライアント ライブラリ(GTL) を使用してGoogle Drive APIにアクセスしています。
それのIntroduction to the Google APIs Client Library for Objective-Cによると、
サービスによるクエリの実行は、本質的に非同期です。
つまり、次のようなパスを作成しようとすると、root/a/b/c
folder を作成する前に、次のことを行うb
必要があります。
が作成されていることを確認してください。そうでない場合は、確認しようとする
a
前に作成してください。b
parentRef
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()
か?)
呼び出しを順番に実行できるようにする方法はありますか?