将 Firebase Firestore 文档值分配给 swift 变量 [重复]
Posted
技术标签:
【中文标题】将 Firebase Firestore 文档值分配给 swift 变量 [重复]【英文标题】:Assigning Firebase Firestore document value to swift variable [duplicate] 【发布时间】:2020-07-08 20:09:02 【问题描述】:所以我试图从 Firebase Firestore 获取数据并将其放入我的函数内的局部变量中。在函数内部,我为名称创建了一个变量,该变量应该包含从 Firebase 获取的用户名称的值。问题在于,赋予 nameData 值(来自数据库的名称)的变量名称实际上从未发生过变异。我应该如何从数据库中获取名称并将其放入变量中?
public func fetchName(email: String) -> String
var name: String = "FIRST VALUE"
database.collection(workerCollection).document(email).getDocument() (querySnapshot, error) in
if let error = error
print("Error getting documents: \(error)")
else
//get info about user
if (querySnapshot != nil && querySnapshot!.exists)
let documentData = querySnapshot!.data()!
if let nameData = (documentData["Name"] as! String?)
name = nameData
print(name)
return name
【问题讨论】:
getDocument()
是异步的,在查询完成之前立即返回。
现在返回的名称是什么?函数是否返回FIRST VALUE
?
【参考方案1】:
在您的函数中添加一个完成处理程序以获取名称。像这样修改你的函数!
public func fetchName(email: String, Completion:@escaping((String)->())
database.collection(workerCollection).document(email).getDocument() (querySnapshot, error) in
if let error = error
print("Error getting documents: \(error)")
else
//get info about user
if (querySnapshot != nil && querySnapshot!.exists)
let documentData = querySnapshot!.data()!
if let nameData = (documentData["Name"] as! String?)
Completion(nameData)
然后在 viewDidLoad
或任何你喜欢的地方调用该函数。
fetchName(email: "a@b.com") (name) in
print(name)
【讨论】:
【参考方案2】:试试这个:
public func fetchName(email: String) -> String?
var name: String?
name = database.collection(workerCollection).whereField("emailField", isEqualTo: email)
dispatchQueue.main.async
return name
【讨论】:
以上是关于将 Firebase Firestore 文档值分配给 swift 变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何将子集合添加到 Firebase Cloud Firestore 中的文档
将 Firebase Firestore 文档值分配给 swift 变量 [重复]
Firebase - 使用 Cloud Functions 定位特定的 Firestore 文档字段
Firebase 存储规则在 Firestore 文档上查找数据? [复制]