Firebase iOS SDK:getDocuments() 调用暂停整个函数并卡住

问题描述 投票:0回答:1

我有一个函数

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
函数挂起。

ios swift firebase google-cloud-firestore
1个回答
0
投票

假设您已经构建了用户集合,以便您要查找的用户 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
}
© www.soinside.com 2019 - 2024. All rights reserved.