SwiftUI分页应用中点击最后一页“下一页”按钮时条目无法标记为已读的问题求助
SwiftUI分页应用中点击最后一页“下一页”按钮时条目无法标记为已读的问题求助
我有一个SwiftUI应用,会从Firestore加载分页数据。当用户使用“下一页”按钮在页面间导航时,条目会自动标记为已读。但当用户在最后一页尝试继续导航(即使没有更多条目)时,当前条目不会被标记为已读。
以下是我的FirestoreDataViewModel中当前的loadNextPage函数:
func loadNextPage() { guard let lastDocument = lastDocument, canLoadMore else { return } markUnreadItemsAsRead() isLoading = true currentPage += 1 var query = db.collection("items") .order(by: "timestamp", descending: true) .start(afterDocument: lastDocument) // 应用过滤器 if showFilterA { query = query.whereField("filterA", isEqualTo: true) } // ... 其他过滤器 query.limit(to: itemsPerPage).getDocuments { snapshot, error in self.isLoading = false if let error = error { self.errorMessage = error.localizedDescription return } guard let snapshot = snapshot else { self.errorMessage = "No more data available" return } let newItems = snapshot.documents.compactMap { self.documentToItem($0) } self.items = newItems self.lastDocument = snapshot.documents.last self.canLoadMore = snapshot.documents.count == self.itemsPerPage } }
我尝试过的方法
- 将
markUnreadItemsAsRead()移到guard语句之前:
func loadNextPage() { markUnreadItemsAsRead() guard let lastDocument = lastDocument, canLoadMore else { return } // ... 函数剩余部分 }
- 在guard语句中直接更新Firestore:
func loadNextPage() { guard let lastDocument = lastDocument, canLoadMore else { let unreadItems = items.filter { !$0.read } for item in unreadItems { db.collection("items").document(item.id).updateData(["read": true]) } return } // ... 函数剩余部分 }
- 使用单独的函数来标记条目为已读:
func markUnreadItemsAsRead() { let unreadItems = items.filter { $0.read == false } for item in unreadItems { db.collection("items").document(item.id).updateData(["read": true]) { error in if let error = error { print("Error marking item as read: \(error.localizedDescription)") } else { DispatchQueue.main.async { if let index = self.items.firstIndex(where: { $0.id == item.id }) { self.items[index].read = true } } } } } }
这些方法都无法在尝试导航到最后一页之后成功标记条目为已读。
期望行为
当用户在最后一页并点击“下一页”按钮时,即使没有更多数据可加载,当前条目也应该在Firestore和本地状态中都标记为已读。
问题
我该如何修改代码,以确保在尝试导航到最后一页之后条目会被标记为已读?我需要一个满足以下条件的解决方案:
- 与现有的分页系统兼容
- 同时更新Firestore和本地状态
- 正确处理最后一页的情况
备注:内容来源于stack exchange,提问作者Kate Throw
相关产品推荐
相关产品推荐

