Google Drive API (GTL) - создать несколько путей к папкам по порядку?
Я использую клиентскую библиотеку API Google для Objective-C (GTL) для доступа к Google Drive API.
В соответствии с его введением в клиентскую библиотеку API Google для Objective-C,
Выполнение запроса сервисом изначально асинхронно.
Что означает, когда вы пытаетесь создать путь как: root/a/b/c
прежде чем вы сможете создать папку b
, вам придется:
Удостовериться
a
создан, если нет, создайте его раньшеb
пытался проверить этоparentRef
,Знать
id
папкиa
так что вы можете создатьb
в этом.
И то же самое c
,
Я использую что-то вроде следующего, чтобы получить 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-й запрос начинается еще до того, как 1-й запрос будет завершен. Я гуглил вокруг, но не видел способа сделать это синхронными звонками вместо этого. (То есть я видел, что ветка Java API может иметь что-то вроде .await()
?)
Есть ли способ убедиться, что вызовы могут быть выполнены в последовательности?
1 ответ
Избегайте использования синхронного цикла for. Функция createFolder должна перезвонить после завершения; этот обратный вызов должен начать следующую итерацию цикла.