Извлечение данных из базы данных Firbase - PullRequest
0 голосов
/ 06 апреля 2019

Я надеялся, что вы, ребята, сможете мне помочь. У меня есть этот код, который я хочу загрузить некоторые данные из FirebaseDatase

    func fetchVinylsData(){
    SVProgressHUD.show()
    guard let currentUID = Auth.auth().currentUser?.uid else { return }

    dbRef.child("vinyls").child(currentUID).observe(.childAdded) { (snapshot) in
        guard let dictionary = snapshot.value as? Dictionary<String,AnyObject> else { return }
        let vinyl = Vinyl(dictionary: dictionary)
        print(dictionary)
        self.vinyls = [Vinyl]()
        self.vinyls.append(vinyl)
        self.vinyls.sort(by: { (vinyl1, vinyl2) -> Bool in
            return vinyl1.artist < vinyl2.artist
        })
        self.tableView.reloadData()
    }
    SVProgressHUD.dismiss()
}

когда я печатаю словарь, я получаю все записи в порядке, но мое табличное представление не заполняется. Я работал нормально, пока не решил добавить новое поле в Vinyl.swift. Структура в базе данных firebase без нового поля. Это проблема? Вот код для Vinyl.swfit:

import UIKit
import Firebase

class Vinyl {
var vinylID : String!
var title : String!
var artist : String!
var label : String!
var vinylCountry : String!
var isOut : Bool = false
var vinylLocation : String!
var year : String!
var vinylAutoID : String!
var vinylFormat : String!

init(dictionary : Dictionary<String,AnyObject>) {
    guard let title = dictionary["title"] as? String else { return }
    guard let artist = dictionary["artist"] as? String else { return }
    guard let label = dictionary["label"] as? String else { return }
    guard let vinylID = dictionary["vinylID"] as? String else { return }
    guard let vinylCountry = dictionary["vinylCountry"] as? String else { return }
    guard let vinylLocation = dictionary["vinylLocation"] as? String else { return }
    guard let year = dictionary["vinylYear"] as? String else { return }
    guard let autoID = dictionary["autoID"] as? String else { return }
    guard let isOut = dictionary["isOut"] as? Bool else { return }
    guard let vinylFormat = dictionary["format"] as? String else { return }

    self.vinylID = vinylID
    self.title = title
    self.artist = artist
    self.label = label
    self.vinylCountry = vinylCountry
    self.isOut = isOut
    self.vinylLocation = vinylLocation
    self.year = year
    self.vinylAutoID = autoID
    self.vinylFormat = vinylFormat
}

}

1 Ответ

0 голосов
/ 07 апреля 2019

Я бы не советовал использовать guard let в вашем init методе, потому что предположим, что dictionary["title"] пусто или недоступно, тогда он вернется из первой строки вашего кода, и то же самое произойдет для других. И для решения этой проблемы вы можете использовать Nil-Coalescing Operator (означает, что вы можете назначить значение по умолчанию nil или любое другое значение, если something["something"] равно nil или optional)

Заменить

guard let title = dictionary["title"] as? String else { return }
guard let artist = dictionary["artist"] as? String else { return }
guard let label = dictionary["label"] as? String else { return }
guard let vinylID = dictionary["vinylID"] as? String else { return }
guard let vinylCountry = dictionary["vinylCountry"] as? String else { return }
guard let vinylLocation = dictionary["vinylLocation"] as? String else { return }
guard let year = dictionary["vinylYear"] as? String else { return }
guard let autoID = dictionary["autoID"] as? String else { return }
guard let isOut = dictionary["isOut"] as? Bool else { return }
guard let vinylFormat = dictionary["format"] as? String else { return }

с

let title = dictionary["title"] as? String ?? ""
let artist = dictionary["artist"] as? String ?? ""
let label = dictionary["label"] as? String ?? ""
let vinylID = dictionary["vinylID"] as? String ?? ""
let vinylCountry = dictionary["vinylCountry"] as? String ?? ""
let vinylLocation = dictionary["vinylLocation"] as? String ?? ""
let year = dictionary["vinylYear"] as? String ?? ""
let autoID = dictionary["autoID"] as? String ?? ""
let isOut = dictionary["isOut"] as? Bool ?? false
let vinylFormat = dictionary["format"] as? String ?? ""

И вам также необходимо обновить UI в основной очереди, когда вы работаете с async вызовами, как показано ниже:

DispatchQueue.main.async {
    self.tableView.reloadData()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...