Я слежу за рекомендациями Firebase по выравниванию данных, но у меня возникли проблемы с перечислением ряда элементов из моей базы данных.
Вот пример моего файла базы данных:
"users" : {
"UID12349USER" : {
"firstName" : "Jon",
"lastName" : "Snow",
"email" : "[email protected]",
"albums" : {
"UID124ALBUM" : true,
"UID125ALBUM" : true
}
}
},
"albums" : {
"UID124ALBUM" : {
"name" : "My Artwork",
},
"UID125ALBUM" : {
"name" : "My Sketches",
}
}
Я получаю список альбомов для данного пользователя:
let userAlbums = database.child(usersKey).child(user.uid).child(albumsKey)
userAlbums.observeSingleEventOfType(.Value, withBlock: { snapshot in
// fetch [UID124ALBUM: 1, UID125ALBUM: 1]
})
Теперь я хотел бы получить все альбомы пользователя в одном запросе. Я мог бы выполнить пакет запросов и заполнить асинхронный массив, но это не похоже на хороший подход ко мне...
for key in albumKeys {
let album = database.child(self.albumsKey).child(key)
album.observeSingleEventOfType(.Value, withBlock: { snapshot in
// fetch album.. append to array
})
}
Использование этого подхода затрудняет обнаружение завершенных запросов из-за асинхронного характера запросов. Добавьте к этому тот факт, что некоторые из запросов могут завершиться неудачно из-за плохого соединения.
Кроме того, если я хочу отфильтровать один из альбомов с заданным именем (например, "Мои работы" ) или вернуть нуль, если он не существует, я также получаю сложное конечное условие.
var found = false
for key in albumKeys {
let album = database.child(self.albumsKey).child(key)
album.observeSingleEventOfType(.Value, withBlock: { snapshot in
// if current.name == "My Artwork"
// completion(current)
})
}
// This block will be called before observeSingleEventOfType =.=
if !found {
completion(nil)
}
У меня хороший фон для iOS и Swift, но я знаю базы данных Firebase и NoSQL. Может ли кто-нибудь указать мне хорошее направление? Должен ли я разорвать Firebase и попробовать что-то еще? Я пропустил какой-то метод, который может запросить то, что мне нужно? Является ли моя json-структура неправильной и не хватает некоторых дополнительных ключей?
Спасибо