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

SwiftUI Firebase:使用getDocument时如何正确返回布尔值?

解决Firebase异步查询导致返回值错误的问题

你的问题核心在于getDocument是异步操作——它发起数据库请求后会立刻往下执行代码,回调闭包里的逻辑要等请求完成才会触发。所以函数执行到return userStatus时,回调还没跑,userStatus还是初始的false,自然每次都返回错误结果。

下面给你两种可行的解决方法:

方法1:使用完成回调(兼容所有Swift版本)

修改函数,不直接返回Bool,而是通过闭包把结果传递出去:

static func checkUserProfile(currentUserID: String, completion: @escaping (Bool) -> Void) {
    let userRecord = db.collection("Users").document(currentUserID)
    
    userRecord.getDocument { docSnap, error in
        // 错误、文档为空或不存在时,返回false
        guard error == nil, let docSnap = docSnap, docSnap.exists else {
            completion(false)
            return
        }
        // 文档存在则返回true
        completion(true)
    }
}

调用示例:

// 替换成你的类名
YourClass.checkUserProfile(currentUserID: "目标用户ID") { userExists in
    if userExists {
        // 写用户存在时的业务逻辑
    } else {
        // 写用户不存在时的业务逻辑
    }
}

方法2:使用Async/Await(Swift 5.5+推荐写法)

如果你的项目用Swift 5.5及以上版本,用异步等待语法可以让代码更简洁,逻辑更直观:

static func checkUserProfile(currentUserID: String) async -> Bool {
    let userRecord = db.collection("Users").document(currentUserID)
    
    do {
        let docSnap = try await userRecord.getDocument()
        return docSnap.exists
    } catch {
        print("查询用户失败:\(error)")
        // 请求出错时默认返回false,可根据需求调整
        return false
    }
}

调用示例(需要在异步上下文里,比如Task中):

Task {
    let userExists = await YourClass.checkUserProfile(currentUserID: "目标用户ID")
    if userExists {
        // 用户存在的逻辑
    } else {
        // 用户不存在的逻辑
    }
}

两种方法里,Async/Await是现在Swift异步编程的推荐方案,代码可读性更高;如果要兼容旧版本Swift,就用完成回调的方式。另外注意不要忽略错误处理,网络请求或数据库操作都可能出现异常情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:57:32