gpt4 book ai didi

swift - 使用 Firebase firestore 进行分页 - swift 4

转载 作者:可可西里 更新时间:2023-10-31 23:57:22 25 4
gpt4 key购买 nike

我正在尝试使用 firestore 对数据进行分页(无限滚动我的表格 View )。我已经尽我所能集成了谷歌为分页提供的代码,但我仍然无法正确加载数据。

初始数据集根据需要加载到 TableView 中。然后,当用户点击屏幕底部时,下一个“x”个项目被加载。但是当用户第二次点击屏幕底部时,相同的“x”个项目被简单地附加到表中看法。相同的项目会无限期地添加。

所以它是最初的 3 个“骑行”对象,接下来的 4 个“骑行”对象将永远重复。

123 4567 4567 4567 4567...

如何正确加载数据?

func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offsetY = scrollView.contentOffset.y
let contentHeight = scrollView.contentSize.height

if offsetY > contentHeight - scrollView.frame.height {
// Bottom of the screen is reached
if !fetchingMore {
beginBatchFetch()
}
}
}

func beginBatchFetch() {
// Array containing "Ride" objcets is "rides"

fetchingMore = true

// Database reference to "rides" collection
let ridesRef = db.collection("rides")

let first = ridesRef.limit(to: 3)

first.addSnapshotListener { (snapshot, err) in
if let snapshot = snapshot {
// Snapshot isn't nil
if self.rides.isEmpty {
// rides array is empty (initial data needs to be loaded in).
let initialRides = snapshot.documents.compactMap({Ride(dictionary: $0.data())})
self.rides.append(contentsOf: initialRides)
self.fetchingMore = false
DispatchQueue.main.asyncAfter(deadline: .now() + 5, execute: {
self.tableView.reloadData()
})
print("first rides loaded in")
}
} else {
// Error
print("Error retreiving rides: \(err.debugDescription)")
return
}

// reference to lastSnapshot
guard let lastSnapshot = snapshot!.documents.last else{
// The collection is empty
return
}


let next = ridesRef.limit(to: 4).start(afterDocument: lastSnapshot)

next.addSnapshotListener({ (snapshot, err) in
if let snapshot = snapshot {

if !self.rides.isEmpty {

let newRides = snapshot.documents.compactMap({Ride(dictionary: $0.data())})
self.rides.append(contentsOf: newRides)
self.fetchingMore = false
DispatchQueue.main.asyncAfter(deadline: .now() + 7, execute: {
self.tableView.reloadData()
})

print("new items")
return
}
} else {
print("Error retreiving rides: \(err.debugDescription)")
return
}

})
}
}

最佳答案

这就是我想出的解决方案!该解决方案很可能会多次调用 firestore,从而为任何实际项目创建大笔账单,但我想您可以说它是作为概念证明。

如果您有任何建议或修改,请随时分享!

以下是所有变量的初始化方式:

var rides = [Ride]()
var lastDocumentSnapshot: DocumentSnapshot!
var fetchingMore = false

如果您有任何建议或修改,请随时分享!

func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offsetY = scrollView.contentOffset.y
let contentHeight = scrollView.contentSize.height
//print("offsetY: \(offsetY) | contHeight-scrollViewHeight: \(contentHeight-scrollView.frame.height)")
if offsetY > contentHeight - scrollView.frame.height - 50 {
// Bottom of the screen is reached
if !fetchingMore {
paginateData()
}
}
}

// Paginates data
func paginateData() {

fetchingMore = true

var query: Query!

if rides.isEmpty {
query = db.collection("rides").order(by: "price").limit(to: 6)
print("First 6 rides loaded")
} else {
query = db.collection("rides").order(by: "price").start(afterDocument: lastDocumentSnapshot).limit(to: 4)
print("Next 4 rides loaded")
}

query.getDocuments { (snapshot, err) in
if let err = err {
print("\(err.localizedDescription)")
} else if snapshot!.isEmpty {
self.fetchingMore = false
return
} else {
let newRides = snapshot!.documents.compactMap({Ride(dictionary: $0.data())})
self.rides.append(contentsOf: newRides)

//
DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
self.tableView.reloadData()
self.fetchingMore = false
})

self.lastDocumentSnapshot = snapshot!.documents.last
}
}
}

关于swift - 使用 Firebase firestore 进行分页 - swift 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52192062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com