Получение нулевого значения из Firebase с использованием Swift - PullRequest
0 голосов
/ 30 апреля 2018

Я пробовал это в течение пяти дней, но не повезло.

Вот мой снимок Firebase:

Snap (Channels) {
    HiruFM =     {
        image = "hiru_fm_logo.png";
        title = "Hiru FM";
    };
    SirasaFM =     {
        image = "sirasa_fm_logo.png";
        title = SirasaFM;
    };
}

Ниже я попробовал:

override func viewDidLoad() {
    super.viewDidLoad()

    ref = Database.database().reference().child("Channels")

    ref.observeSingleEvent(of: .value) { (snap) in
        print(snap) // checking if the snap grabs the data (confirmed)
        guard var data = snap.value as? Dictionary<String, Any> else {return}


        let channeTitle = data["title"] as? String ?? "No title"
        print(channeTitle) // prints "No title" (this is the problem)

        let channelImage = data["image"] as? String ?? "No image"
        print(channelImage) // prints "No image"
        let myData = Channels(title: channeTitle, image: channelImage)
        self.channels.append(myData)
    }
}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Важно понимать разницу между чтением узла по .value и .childAdded, и еще одно соображение - отсоединение ключей родительского узла от данных, которые он содержит.

Начните со следующей структуры

channels
  chan_0
    image: "hiru_fm_logo.png"
    name: "HiruFM"
    title "Hiru FM"
  chan_1
    image: "sirasa_fm_logo.png"
    name: "SirasaFM"
    title "Sirasa FM"

chan_0, chan_1 и т. Д. Ключи создаются с помощью childbyAutoId и позволяют отделить ключи от дочерних данных. Таким образом, если одно из дочерних значений изменяется, оно сохраняет целостность между родительским узлом и другими узлами, которые на него ссылаются. На практике, если HiruFM становится HiruXM, все, что нужно сделать, это изменить дочерний узел, а не родительский.

Тогда структура для хранения ваших данных. Обратите внимание, что структура init разбивает снимок и назначает свойства

struct ChannelStruct{
    var image = ""
    var title = ""
    var name = ""

    init(aSnap: DataSnapshot) {
        let dict = aSnap.value as! [String: Any]

        if let image = dict["image"] as? String {
            self.image = image
        }

        if let title = dict["title"] as? String {
            self.title = title
        }

        if let name = dict["name"] as? String {
            self.name = name
        }
    }
}

и массив классов для хранения структур

var channels = [ChannelStruct]()

и, наконец, код для чтения в узле и итерации по дочерним узлам, чтобы добавить их в массив

ref = Database.database().reference().child("channels")
ref.observeSingleEvent(of: .value) { snapshot in
    if snapshot.exists() {
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let aChannel = ChannelStruct(aSnap: snap)
            self.channels.append(aChannel)
        }
    } else {
        print("no channels found")
    }
}

Обратите внимание, что при чтении по .value, родительскому узлу, channel , считываются ВСЕ дочерние узлы, поэтому они должны повторяться для получения каждого дочернего узла - это также поддерживает их порядок. Принимая во внимание, что если мы используем .childAdded, он представляет каждый дочерний узел по одному, поэтому итерация не требуется.

0 голосов
/ 30 апреля 2018

Я думаю, тебе стоит попробовать

for imageData in data
{
    let item:NSDictionary = imageData as NSDictionary
    let channeTitle = data["title"] as? String ?? "No title"
    print(channeTitle)
    let channelImage = data["image"] as? String ?? "No image"
    print(channelImage) 
    let myData = Channels(title: channeTitle, image: channelImage)
    self.channels.append(myData)
}

Здесь, если вам нужно сначала извлечь данные из словаря словаря, вам нужно извлечь все данные, а затем данные их дочерних узлов в цикле.

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