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

SwiftUI中如何判断Cloud Firestore查询是否返回文档

解决Firestore随机查询文档的结果判断问题

你目前的代码只创建了查询对象,但没有实际发起查询请求,所以无法判断是否获取到文档。要解决这个问题,需要执行查询的getDocuments方法,并在回调中检查返回结果。同时,双向法本身需要处理两种情况:找到小于等于随机数的文档,或者找不到时去查大于随机数的最小文档。

修改后的完整代码如下:

func obtainRandom() {
    let db = Firestore.firestore()
    let collectionRef = db.collection("users")
    
    collectionRef.getDocuments { snapshot, error in
        guard let documents = snapshot?.documents, !documents.isEmpty else {
            // 处理集合为空或请求错误
            return
        }
        
        let randomNum = Int(arc4random_uniform(1000000)) + 1000000
        
        // 执行第一次查询:找小于等于randomNum的最大random值文档
        collectionRef.whereField("random", isLessThanOrEqualTo: randomNum)
            .order(by: "random", descending: true)
            .limit(to: 1)
            .getDocuments { querySnapshot, queryError in
                if let error = queryError {
                    print("查询出错:\(error.localizedDescription)")
                    return
                }
                
                // 判断第一次查询是否拿到文档
                if let randomDoc = querySnapshot?.documents.first {
                    // 成功获取到随机文档,执行后续逻辑
                    print("随机文档数据:\(randomDoc.data())")
                    // 在这里写你需要的下一步操作
                } else {
                    // 第一次没找到,执行双向法的第二部分:找大于randomNum的最小random值文档
                    collectionRef.whereField("random", isGreaterThan: randomNum)
                        .order(by: "random")
                        .limit(to: 1)
                        .getDocuments { secondSnapshot, secondError in
                            if let error = secondError {
                                print("二次查询出错:\(error.localizedDescription)")
                                return
                            }
                            
                            if let secondRandomDoc = secondSnapshot?.documents.first {
                                print("二次查询获取到随机文档:\(secondRandomDoc.data())")
                                // 执行后续逻辑
                            } else {
                                // 极端情况:前面已经确认集合非空,这里基本不会触发
                                print("未找到任何匹配文档")
                            }
                        }
                }
            }
    }
}

关键说明:

  • 必须调用getDocuments方法才会向Firestore发起实际请求,回调闭包里才能拿到查询结果
  • 通过querySnapshot?.documents.first判断是否有匹配文档:存在则直接处理,不存在则走双向法的另一分支
  • 两次查询都要处理错误情况,保证逻辑的稳定性

内容的提问来源于stack exchange,提问作者Sutton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:15:33