Получение nil при разборе значений Firebase быстро с использованием Codable и CodableFirebase - PullRequest
3 голосов
/ 21 октября 2019

Я использую базу данных Firebase Realtime, использую кодируемый подход в быстрой и внешней библиотеке CodableFirebase. Я создал структуру модели, но когда я пытаюсь проанализировать значения (поскольку я получаю все значения) со структурой модели, это дает мне ноль. В моей базе данных есть ключи, которые могут быть неправильно обработаны во вложенных значениях. Пожалуйста помоги. Спасибо

прикреплен снимок структуры базы данных.

database

Код:

Database.database().reference().child("users").observeSingleEvent(of: .value, with: { (snapshot) in
            guard let value = snapshot.value as? [String: Any] else { return }
            do {

                let friendList = try FirebaseDecoder().decode(Response.self, from: value)

                guard let conversationUid = value["conversationUid"] as? String,
                let friendStatus = value["friendStatus"] as? String,
                let notify = value["notify"] as? Bool,
                let phNumber = value["phoneNumber"] as? String,
                let uid = value["uid"] as? String
                else { return }


            } catch let error {
                print(error)
            }
        })

JSON:

{
  "FTgzbZ9uWBTkiZK9kqLZaAIhEDv1" : {
    "friends" : {
      "zzV6DQSXUyUkPHgENDbEjXVBj2" : {
        "conversationUid" : "-L_w2yi8gh49GppDP3r5",
        "friendStatus" : "STATUS_ACCEPTED",
        "notify" : true,
        "phoneNumber" : "+9053",
        "uid" : "zzV6DQSXUyUkPHgEZ9EjXVBj2"
      }
    },
    "lastLocation" : {
      "batteryStatus" : 22,
      "latitude" : 48.90537,
      "longitude" : 28.042,
      "timeStamp" : 1556568633477,
      "uid" : "FTgzbZ9uWkiZK9kqLZaAIhEDv1"
    },
    "profile" : {
      "fcmToken" : "fp09-Y9ZAkQ:APA91bFgGBsyFx0rtrz7roxzpE_MmuSaMc4is-XIu7j718qjRVCSHY4PvbNjL1LZ-iytaeDKviIRMH",
      "name" : "Mt Bt",
      "phoneNumber" : "+90503",
      "uid" : "FTgzbZ9uWBTkiZLZaAIhEDv1"
    }
  }

Модель:

struct Response : Codable {

    let friends : Friend?
    let lastLocation : LastLocation?
    let profile : Profile?
}

struct Friend: Codable {
    let converstionUid: String?
    let friendStatus: String?
    let notify: Bool?
    let phoneNumber: String?
    let uid: String?

}

struct Profile : Codable {

    let fcmToken : String?
    let name : String?
    let phoneNumber : String?
    let uid : String?
}

struct LastLocation : Codable {

    let batteryStatus : Int?
    let latitude : Float?
    let longitude : Float?
    let timeStamp : Int?
    let uid : String?
}

1 Ответ

2 голосов
/ 21 октября 2019

Ваш код читает весь узел users, а затем пытается прочитать conversationUid и другие свойства этого узла. Так как эти свойства не существуют непосредственно под узлом users , вы получаете нулевое значение.

Чтобы правильно проанализировать этот JSON, вам нужно будет перед тем, как перейти к трем уровням дочерних узловвы пытаетесь прочитать именованные свойства, такие как conversationUid.

Database.database().reference().child("users").observeSingleEvent(of: .value, with: { (snapshot) in
  for userSnapshot in snapshot.children.allObjects as! [DataSnapshot] {
    let friendsSnapshot = userSnapshot.childSnapshot(forPath: "friends")
    for friendSnapshot in friendsSnapshot.children.allObjects as! [DataSnapshot] {

      guard let value = friendSnapshot.value as? [String: Any] else { return }
      do {
        guard let conversationUid = value["conversationUid"] as? String,
        ...

Приведенный выше код сначала проходит по дочерним узлам первого уровня в /users, а затем - по дочерним элементам friendsузел для каждого пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...