UITableView не обновляется во время извлечения данных из firebase - PullRequest
0 голосов
/ 07 февраля 2019

При запуске у меня установлено приложение для получения данных из Firebase, создания объектов и добавления их в массив, где они добавляются в UITableView.Даже если каждый объект создается индивидуально, элементы создаются, но не добавляются в UITableView, пока не будет создан каждый объект из данных.

Firebase работает в основном потоке, поэтому проблема не в GCD.Я запускаю retrieveData () в viewDidLoad.

Кажется, что элементы помещаются в память (не добавлены в табличное представление?) И продолжают складываться, пока не будут созданы все элементы.В этот момент все загружается в просмотр таблицы, и использование памяти возвращается к нормальному.Это приводит к чрезвычайно высокому использованию памяти и сбою при наличии достаточного количества элементов.

func retrieveData(){
    let dateString = getDate()
    ref = Database.database().reference()
    ref.child("orders/").child(Auth.auth().currentUser!.uid).child(dateString).child("products").observeSingleEvent(of: .value, with: { (snapshot) in

        let value = snapshot.value as? NSDictionary
        if (value != nil){
            for (key) in value! {
                let item = key.value as? [String:Any]
                let (barcode, name, _, bottleSize) = self.getInfo(code: item!["code"]! as! String)
                self.generateItem(barcode: barcode, name: name, bottleSize: bottleSize, quantity: item!["quantity"]! as! String, isInitial: true)
            }
        }
    }) { (error) in
        print(error.localizedDescription)
    }
}


func generateItem(barcode: String, name: String, bottleSize: String, quantity: String, isInitial: Bool = false) {
    let i = item(code: barcode, name: name, size: bottleSize, quantity: quantity)
    order.append(i)

    print("Item Created --- ", order[order.count - 1].name,order[order.count - 1].quantity,order[order.count - 1].code)

    let indexPath = IndexPath(row: order.count - 1, section: 0)
    orderTableView.beginUpdates()
    orderTableView.insertRows(at: [indexPath], with: .automatic)
    orderTableView.endUpdates()

    // Update Firebase database
    if (isInitial == false){
        updateDatabase()
    }
}

1 Ответ

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

Сначала попытайтесь создать объект item и добавить к массиву, затем вызвать reloadData() напрямую.Посмотрите, как это работает.

    let value = snapshot.value as? NSDictionary
    if (value != nil){
        for (key) in value! {
            let item = key.value as? [String:Any]
            let (barcode, name, _, bottleSize) = self.getInfo(code: item!["code"]! as! String)
            let i = item(code: barcode, name: name, size: bottleSize, quantity: quantity)
            order.append(i)
        }
        orderTableView.reloadData()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...