Значение, полученное повторно из закрытия - PullRequest
0 голосов
/ 03 октября 2018

Я сделал массив объектов playerArray для хранения данных плеера, затем я вызываю базу данных firebase через ref.В замыкании я получаю значение из firebase и присваиваю его свойству .name, но из замыкания значение повторно инициализируется до начального значения.

var playerArray:[model] = [model]()

let ref = Database.database().reference().child("Players").child("Ronaldo")


func read(){

    ref.observe(.value) { (snap) in
        var val = snap.value as! Dictionary<String,AnyObject>
        let name = val["Name"] as! String
        let Model = model()
        Model.name = name
        self.playerArray.append(Model)
        print(snap)
    }

} 
 override func viewDidLoad() {
    super.viewDidLoad()
    read()
    table.delegate = self
    table.dataSource = self
    table.reloadData()
}

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Вам следует перезагрузить таблицу после изменения параметра.в viewDidLoad () это происходит один раз.

0 голосов
/ 03 октября 2018

После добавления playerArray в закрывающее тело вы должны обновить таблицу

override func viewDidLoad() {
    super.viewDidLoad()
    table.delegate = self
    table.dataSource = self
    read()
}


func read(){

    ref.observe(.value) { (snap) in
        var val = snap.value as! Dictionary<String,AnyObject>
        let name = val["Name"] as! String
        let Model = model()
        Model.name = name
        self.playerArray.append(Model)
        print(snap)
        self.table.reloadData()

    }

} 
.
0 голосов
/ 03 октября 2018

Проблема в том, что вы не перезагружаете табличное представление после асинхронного извлечения данных в read.Вам просто нужно вызвать reloadData из обработчика завершения observe.

ref.observe(.value) { (snap) in
    var val = snap.value as! Dictionary<String,AnyObject>
    let name = val["Name"] as! String
    let Model = model()
    Model.name = name
    self.playerArray.append(Model)
    DispatchQueue.main.async {
        self.table.reloadData()
    }
}

Также нет необходимости вызывать reloadData в viewDidLoad.

...