如何从存储在 Firestore (Swift) 中的文档中返回对象
Posted
技术标签:
【中文标题】如何从存储在 Firestore (Swift) 中的文档中返回对象【英文标题】:How do I return an object from a document stored in Firestore (Swift) 【发布时间】:2020-02-14 11:56:22 【问题描述】:我在 firebase 中有一个用户集合和一个用户结构。我需要编写一个函数,接收用户的 id 并返回相应的用户对象:
struct AppUser: Codable
var id: String
var displayName: String
var photoURL: String
var points: Int?
var knownLanguageCodes: Set<String>?
这是我目前拥有的功能。
func getUser(id: String) -> AppUser?
let db = Firestore.firestore()
let userRef = db.collection("users").document(id)
userRef.getDocument (document, error) in
if let document = document, document.exists
let userID = document.data()?["id"] as! String
let userDisplayName = document.data()?["displayName"] as! String
let userPhotoURL = document.data()?["photoURL"] as! String
let userPoints = document.data()?["points"] as! Int?
let userKnownLanguageCodes = document.data()?["knownLanguageCode"] as! Set<String>?
let user = AppUser(id: userID,
displayName: userDisplayName,
photoURL: userPhotoURL,
points: userPoints,
knownLanguageCodes: userKnownLanguageCodes)
return user
else
print("Error getting user")
return nil
上面的两个return语句都给出了错误:Unexpected non-void return value in void function
我在https://cloud.google.com/firestore/docs/query-data/get-data 的“自定义对象”标题下查看了代码,它似乎对我不起作用。我收到错误:“NSObject”类型的值没有成员“数据”。这是在链接中代码的第 6 行生成的。
【问题讨论】:
【参考方案1】:你不能在闭包内返回使用类似的完成
func getUser(id: String,completion:@escaping((AppUser?) -> ()))
let db = Firestore.firestore()
let userRef = db.collection("users").document(id)
userRef.getDocument (document, error) in
if let document = document, document.exists
let userID = document.data()?["id"] as! String
let userDisplayName = document.data()?["displayName"] as! String
let userPhotoURL = document.data()?["photoURL"] as! String
let userPoints = document.data()?["points"] as! Int?
let userKnownLanguageCodes = document.data()?["knownLanguageCode"] as! Set<String>?
let user = AppUser(id: userID,
displayName: userDisplayName,
photoURL: userPhotoURL,
points: userPoints,
knownLanguageCodes: userKnownLanguageCodes)
completion(user)
else
print("Error getting user")
completion(nil)
打电话
getUser(id:<#str#>) user in
print(user)
【讨论】:
这个getUser.(id:<#str#>) user in
应该是self.getUser(id: idString) user in
只是一件小事;-)以上是关于如何从存储在 Firestore (Swift) 中的文档中返回对象的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中将 Firestore FieldValue 解析为日期
如何从 Cloud Firestore 上的对象中检索值?迅速
如何在 Swift 中从 Cloud FireStore Firebase 访问特定字段
如何从Swift中的Cloud FireStore Firebase访问特定字段