如何在 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?
如何按文档 ID 从 Firebase Firestore 获取数据 - iOS?