我无法从函数中获取 3 个值,我收到一条错误消息:
无法将类型“(String, String, String)”的值转换为闭包结果类型“Void”
这是代码:
func readDataUser() -> (uid: String, plan: String, role: String) {
let ref = Database.database().reference()
let userUid = AuthManager.shared.retrieveUid
let nodeUser = ref.child(RefDatabase.users.rawValue).child(userUid())
nodeUser.observeSingleEvent(of: .value) { snapshot in
let uid = snapshot.childSnapshot(forPath: "uid").value as? String ?? "no name"
let plan = snapshot.childSnapshot(forPath: "plan").value as? String ?? "no name"
let role = snapshot.childSnapshot(forPath: "role").value as? String ?? "no name"
return (uid, plan, role)
// Cannot convert value of type '(String, String, String)' to closure result type 'Void'
}
// if return (uid, plan, role) i put here it doesn't give the error, but it doesn't print the values, they are empty
}
我希望您为我打印这些值:
let dataUser = RealtimeManager.shared.readDataUser()
print("User data is: \(dataUser.uid) - \(dataUser.plan) - \(dataUser.role)")
正如@vadian 所说,这是一项
async
任务。因此,你不能把它当作正常的sync
。我更喜欢新的 API async
而不是 completion
。
首先,你需要将
observeSingleEvent
补全包裹在withUnsafeContinuation
中:
func readDataUser() async -> (uid: String, plan: String, role: String) {
...
return await withUnsafeContinuation { continuation in
nodeUser.observeSingleEvent(of: .value) { snapshot in
let uid = snapshot.childSnapshot(forPath: "uid").value as? String ?? "no name"
let plan = snapshot.childSnapshot(forPath: "plan").value as? String ?? "no name"
let role = snapshot.childSnapshot(forPath: "role").value as? String ?? "no name"
continuation.resume(returning: (uid, plan, role))
}
}
}
然后获取
Task
内的值:
Task {
let dataUser = await self.readDataUser()
print("User data is: \(dataUser.uid) - \(dataUser.plan) - \(dataUser.role)")
}