#ios #swift #firebase #firebase-realtime-database
#iOS #swift #firebase #firebase-база данных в реальном времени
Вопрос:
Я хотел бы получить данные из моего снимка Firebase и установить для них переменные в моем проекте. Я получаю данные, но я не знаю, как их проанализировать, чтобы я мог их установить. Я пытаюсь сделать что-то вроде того, что SwiftyJSON делает с вызовами API.
Вот моя структура данных в firebase: 
Вот моя функция: 
Вот вывод в консоль: 
Есть ли какой-либо способ проанализировать и установить значения из массива (ls) и установить «fromId», «text», «toId» в разные переменные для каждого узла?
Комментарии:
1. Публикуйте свой код в виде текста, а не фрагмента
2. Важно отметить, что возвращаемый моментальный снимок не является массивом , это словарь , поэтому порядок данных не гарантируется (технически FIRDataSnapshot). Вы можете использовать .OrderBy, чтобы задать порядок с помощью Firebase или отсортировать его в коде, если порядок важен. Документация Firebase описывает, как анализировать данные в моментальном снимке, считывать и записывать данные . Хотя документы в настоящее время не очень быстрые, примените практику в ответе @Dravidian.
Ответ №1:
Попробуйте использовать:-
FIRDatabase.database().reference().child("users/userID/ls").observeSingleEvent(of : .value, with : {(Snap) in
if let snapDict = Snap.value as? [String:AnyObject]{
for each in snapDict{
print("(each.value["fromId"] as! String)")
}
}
})
Комментарии:
1. Для Swift 3 вам нужно будет развернуть Snap, чтобы он был Snap?.значение
2. @Jay я думаю, что нет, фактически компилятор просит меня удалить необязательный
?
3. @Davidian Вау — интересно. Xcode помечал Snap, но ошибка на самом деле была опечаткой: observerSingleEvent должно быть observeSingleEvent . Я отзываю свой комментарий и исправил код в вашем ответе. (и проголосовал за исчерпывающий ответ!)
Ответ №2:
Вы должны иметь возможность преобразовать значение FIRDataSnapshot в словарь [String:Any], а затем получить доступ к значениям с помощью ключей «fromId», «text» и «toId» и присвоить эти значения переменным.
Ответ №3:
Простым способом было бы: SnapshotParser
Просто реализуйте свои классы:
func main(){
let users=SnapshotParser().parseAsList(snap: Snapshot, type: User.self)
for user in users{
//do something with your object
}
}
class User: ParsableSnapshot {
var id:String?=nil
var email:String?=nil
var ls:[Ls]?=nil
required init(){}
func bindProperties(binder: SnapshotParser.Binder) {
binder.bindField(name: "id", field: amp;id)
binder.bindField(name: "email", field: amp;email)
binder.bindList(name: "ls", list: amp;ls)
}
}
class Ls: ParsableSnapshot {
var id:String?=nil
var fromId:String?=nil
var text:String?=nil
var told:String?=nil
required init(){}
func bindProperties(binder: SnapshotParser.Binder) {
binder.bindField(name: "id", field: amp;id)
binder.bindField(name: "fromId", field: amp;fromId)
binder.bindField(name: "text", field: amp;text)
binder.bindField(name: "told", field: amp;told)
}
}