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