Swift child возвращает Null при вложении или ObserveSingleEvent, возвращает нормально, когда не вложенный - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь вернуть ребенка от ребенка.весь snapshotValue возвращает ноль.Когда я получаю те же данные, что и дочерний (не вложенный), он получает нормально.

Я использую XCode 10 и Swift 4

Для устранения неполадок у меня есть два узла, называемые «промоутеры».,Один в корне и один вложенный внутри дочернего элемента «Партнеры» (предпочтительно).Я удалю узел верхнего уровня, когда у меня будет работать вложенный узел.

Вот структура данных:

"Partners" : {
    "Acts" : [hidden],
    "Promoters" : [ null, {
      "Cell" : hidden,
      "Contact Name" : “hidden”,
      "Email" : “hidden”,
      "Facebook" : “hidden“,
      "Title" : "CHORD Productions"
    } ]
  },
"Promoters" : {
    "chord" : {
      "Title" : "Chord Productions"
    }
  }

Получает искомые данные (список заголовков).для заполнения средства выбора):

        let promotersDB = Database.database().reference().child("Promoters")
        promotersDB.observe(.childAdded) { (snapshot) in

            let snapshotValue = snapshot.value as! Dictionary<String, String>
            let promoterName = snapshotValue["Title"]!
            let promoter = PromoterClass()
            promoter.promoterName = promoterName
            self.promoterArray.append(promoter)
            let isSuccess = true
            completion(isSuccess)
        }

Возвращает nil:

        let promotersDB = Database.database().reference().child("Partners").child("Promoters")
        promotersDB.observe(.childAdded) { (snapshot) in

            let snapshotValue = snapshot.value as! Dictionary<String, String>
            let promoterName = snapshotValue["Title"]!
            let promoter = PromoterClass()
            promoter.promoterName = promoterName
            self.promoterArray.append(promoter)
            let isSuccess = true
            completion(isSuccess)
        }

Я бы предпочел наблюдать заSingleEvent, но также возвращает nil:

        let promotersDB = Database.database().reference().child("Promoters")
        promotersDB.observeSingleEvent(of: .value, with: { (snapshot) in

            let snapshotValue = snapshot.value as! Dictionary<String, String>
            let promoterName = snapshotValue["Title"]!
            let promoter = PromoterClass()
            promoter.promoterName = promoterName
            self.promoterArray.append(promoter)
            let isSuccess = true
            completion(isSuccess)
        })

ошибка:

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

** Сейчас я использую принудительное развертывание, которое будет рассмотрено позже, после изучения того, сколько целостности данных можно сделать с помощью правил бэкэнда:)

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 01 февраля 2019

Я думаю, что firebase обычно предлагает метод Fan Out при работе с деревьями данных, так что вы не должны в любом случае вложить массив типа "Промоутеры".

Вы также захотите определитькаждый из организаторов - по uid, а не по имени (в случае, если вам необходимо изменить их имя в системе).

Поэтому, если вы хотите, попробуйте реструктурировать ваши данные следующим образом:

let uid = Database.database().reference().child("Promoters").childByAutoId()
// uid will be some super long string of random letters and numbers, for example like: 1hjK2SCRV2fhCI0Vv3plGMct3mL2

"Promoters" : {
    "1hjK2SCRV2fhCI0Vv3plGMct3mL2" : {
      "Title" : "Chord Productions"
    }
  }

И затем, когда вы хотите запросить значения в ветви этого промоутера:

let titleRef = Database.database().reference().child("Promoters").child(uid)

titleRef.observeSingleEvent(of: .value) { (snapshot) in
    if let dict = snapshot.value as? [String: AnyObject] {
        let promoter = PromoterClass()
        promoterName = dict["Title"] as? String
        promoter.promoterName = promoterName
    }
}
...