如何在 Firestore (iOS) 中获取对象

Posted

技术标签:

【中文标题】如何在 Firestore (iOS) 中获取对象【英文标题】:How to get an object in Firestore (iOS) 【发布时间】:2020-02-16 15:26:46 【问题描述】:

如何在 Swift 中通过 id 获取 Firestore 中的对象?然后我需要使用这个对象在 UI 中生成内容。我正在使用 SwiftUI。 我要获取的对象是用户,它具有以下结构:

struct AppUser: Codable 

    var id: String
    var displayName: String
    var photoURL: String
    var points: Int
    var knownLanguageCodes: Set<String>


“用户”集合中的每个文档都有 AppUser 结构中的字段。理想情况下,我想编写一个从 Firestore 返回 AppUser 对象的函数:

func getUser(withId id: String) -> AppUser 
    //I don't know how to write this function

然后该对象将像这样使用:

struct ProfileHeadingView: View 

    let userId: String
    let user = getUser(withId: userId)

    var body: some View 
        HStack 
            ImageView(withURL: self.user.photoURL)
                .frame(width: 90, height: 90)
                .clipShape(Circle())
            VStack (alignment: .leading) 
                Text(self.user.displayName)
                    .font(.largeTitle)
                    .fontWeight(.heavy)
                HStack 
                    Text(String(self.user.points))
                        .font(.title)
                    Spacer()
                
            .padding(.horizontal)
        
    

【问题讨论】:

【参考方案1】:

Firebase 的大多数 API 都是异步的 - 这是因为它们中的大多数都涉及网络调用,这比在手机上执行代码要慢得多!

因此,您的 getUser 方法需要像这样重写:

import FirebaseFirestoreSwift

func getUser(userId: String, completion: @escaping (_ user: AppUser?, _ error: Error?) -> Void) 
  db.collection("users").document(userId).getDocument  (snapshot, error) in
    let user = try? snapshot?.data(as: AppUser.self)
    completion(user, error)
  


注意:为了能够使用 Firestore 的 Codable 支持,您必须将 pod 'FirebaseFirestoreSwift' 添加到您的 Podfile

至于如何(以及何时)获取用户,这在很大程度上取决于ProfileHeadingView 是否是列表视图的一部分(或者正在从列表视图导航到)。

如果它是列表视图的一部分,我建议一次获取所有用户 - 您可以使用快照侦听器到 listen for any updates to the users collection,或执行 one-time fetch to read the users collection once。

然后,从列表视图中,将相应的user 对象传递给ProfileHeadingView

【讨论】:

感谢您的回复。我在函数的第 3 行收到错误“Incorrect argument label in call (have 'as:', expected 'with:')”。 您需要将 FirebaseFirestoreSwift 添加到您的 Pod 中,然后在您的 Swift 文件中导入 FirebaseFirestoreSwift。这将允许您轻松读取/写入实现 Codable 的结构。

以上是关于如何在 Firestore (iOS) 中获取对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift iOS Firestore 中获取单元格文档 ID?

如何从对象中获取 FireStore 文档 ID?

如何按文档 ID 从 Firebase Firestore 获取数据 - iOS?

如何从 Firestore 文档中获取自定义对象的 ArrayList? [复制]

在firebase firestore中获取对象内的数据?

如何在 Firebase Firestore 中获取内部集合