Пагинация базы данных в реальном времени Firebase, отображающая 20 записей одновременно - PullRequest
1 голос
/ 18 июня 2019

У меня 62 записи с базой данных Firebase Realtime. Я хочу показывать 20 записей одновременно с табличным представлением (UITableView). Я могу показать первые 20 записей без проблем. Но таблица не будет отображать следующий набор, когда пользователь прокручивает страницу вниз.

import UIKit
import Firebase

class ReadViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    var refInventory: DatabaseReference!
    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        refInventory = Database.database().reference().child("inventory")
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        readData()
    }

    var dataObject = [DataObject]() // DataObject is an `NSObject` object with three properties (id, uuid, number).
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataObject.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell
        let object = dataObject[indexPath.row]
        cell.uuidField.text = object.uuid
        cell.numberField.text = String(object.number)
        return cell
    }

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        if indexPath.row >= dataObject.count - 1 {
            readMoreData()
        }
    }

    func readData() {
        let query = refInventory.queryLimited(toFirst: 20)
        query.observe(DataEventType.value) { (snapshot) in
            guard let first = snapshot.children.allObjects.first as? DataSnapshot else {
                return
            }
            guard let last = snapshot.children.allObjects.last as? DataSnapshot else {
                return
            }
            print(first.key);print(last.key)
            if snapshot.childrenCount > 0 {
                for items in snapshot.children.allObjects as! [DataSnapshot] {
                    let object = items.value as! [String: AnyObject]
                    let uuid = object["uuid"] as! String
                    let num = object["number"] as! Int
                    let myObject = DataObject()
                    myObject.uuid = uuid
                    myObject.number = num
                    self.dataObject.append(myObject)
                }
                self.queryKey = last.key // -LhZCF41n7Xh8g57YN29
                self.tableView.reloadData()
            }
        }
    }

    var queryKey = String()
    func readMoreData() {
        let query = refInventory.queryLimited(toFirst: 20).queryStarting(atValue: queryKey)
        query.observe(DataEventType.value) { (snapshot) in
            // It stops right here //
            guard let first = snapshot.children.allObjects.first as? DataSnapshot else {
                return
            }
            guard let last = snapshot.children.allObjects.last as? DataSnapshot else {
                return
            }
            print(first.key);print(last.key)
            if snapshot.childrenCount > 0 {
                for items in snapshot.children.allObjects as! [DataSnapshot] {
                    let object = items.value as! [String: AnyObject]
                    let uuid = object["uuid"] as! String
                    let num = object["number"] as! Int
                    let myObject = DataObject()
                    myObject.uuid = uuid
                    myObject.number = num
                    self.dataObject.append(myObject)
                }
                self.queryKey = last.key
                self.tableView.reloadData()
            }
        }
    }
}

Показаны некоторые записи с изображением ниже. В таблице содержится 20 записей, начиная с -LhZC4FWPCaOGtq03iho и заканчивая -LhZCF41n7Xh8g57YN29. Когда пользователь прокручивает страницу вниз, мне нужно показать следующие 20 записей, которые начинаются с LhZCF41n7Xh8g57YN2B.

enter image description here

Так что я делаю не так? Я могу изменить queryStarting на queryEnding или queryLimited(toFirst: xxx) на queryLimited(toLast: xxx) здесь и там, чтобы заставить таблицу загружать еще 20 записей, за исключением того, что таблица будет отображать точно такой же набор записей. Спасибо.

1 Ответ

3 голосов
/ 18 июня 2019

Я добился того же, используя приведенный ниже код. Вы можете использовать queryOrderedByKey для сортировки.

Код:

ref.queryOrderedByKey().queryStarting(atValue: self.queryKey).queryLimited(toLast: 20).observeSingleEvent(of: .value, with: { snapshot in            
    // Do stuff with this page of elements                                                                                                                              
})

Возможно, некоторые методы устарели или недоступны из-за последней версии Firebase SDK. Я сделал это в 2017 году.

Спасибо

...