Как установить переменные из моментального снимка Firebase (swift)

#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)
    }
}