You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    }
}

我尝试过的方法

  1. 将markUnreadItemsAsRead()移到guard语句之前:
func loadNextPage() {
    markUnreadItemsAsRead()
    guard let lastDocument = lastDocument, canLoadMore else {
        return
    }
    // ... 函数剩余部分
}
  1. 在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
    }
    // ... 函数剩余部分
}
  1. 使用单独的函数来标记条目为已读:
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和本地状态中都标记为已读。

问题

我该如何修改代码,以确保在尝试导航到最后一页之后条目会被标记为已读?我需要一个满足以下条件的解决方案:

  1. 与现有的分页系统兼容
  2. 同时更新Firestore和本地状态
  3. 正确处理最后一页的情况

备注:内容来源于stack exchange,提问作者Kate Throw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 09:33:51