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
相关产品推荐
相关产品推荐

