我有一个函数
getStoredUser()
,它获取“users”集合中的文档,其中 id
等于 userId
变量,如果不存在,则创建一个。getDocuments()
会停止整个函数的执行(可能是因为它不返回任何内容)。
该函数不是
main
线程的一部分。
func getStoredUser() async throws -> StoredUser? {
print("UserRepository: Get Stored User")
let query = usersReference
.whereField("id", isEqualTo: userId)
do {
let querySnapshot = try await query.getDocuments() // <-------
print(querySnapshot)
if let first = querySnapshot.documents.first {
let document = try first.data(as: StoredUser.self)
print("There is a document", first)
return document
} else {
print("No document")
let doc = StoredUser(id: userId, usedBefore: false, achievements: Achievement(), userID: userId)
print(doc)
try await createStoredUser(doc)
return doc
}
} catch {
print("Error fetching stored user:", error)
throw error
}
}
我期待得到
StoredUser
或 nil
的响应,但它不会返回任何内容。断点在第 6 行停止执行,但在第 7 行没有停止,表明 getDocuments
函数挂起。
假设您已经构建了用户集合,以便您要查找的用户 ID 是文档 ID,则无需
query
进行查找。 您可以简单地尝试获取文档。
我会将用户 ID 传递给函数,而不是依赖属性,并且函数不需要返回可选值 - 它要么找到用户,创建用户,要么
throws
出现错误
func getStoredUser(userId: string) async throws -> StoredUser {
let userDocument = try await usersReference.document(userId).getDocument()
if userDocument.exists {
return try userDocument.data(as: StoredUser.self)
}
let doc = StoredUser(id: userId, usedBefore: false, achievements: Achievement(), userID: userId)
try await createStoredUser(doc)
return doc
}