我想使用Firestore从函数返回文档。这是我的查询:
public class func getProductsInShoppingList(name:String = "Default") -> DocumentSnapshot?{
let db = Firestore.firestore()
let defaults = UserDefaults.standard
let userId: String! = defaults.string(forKey: "UserUUID")
var doc:DocumentSnapshot?
db.collection("shoppingLists")
.whereField("users." + userId, isEqualTo: true)
.whereField("name", isEqualTo: name)
.limit(to: 1)
.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
doc = document
break
}
}
}
return doc
}
这显然是异步操作。返回和使用文档的正确方法是什么。通知?打回来?谢谢
就像在DidLoad中一样,只需添加一个观察者
override func viewDidLoad()
{
super.viewDidLoad()
//Add notification Observer to get status out of Async mode
NotificationCenter.default.addObserver(self, selector: #selector(loadList), name: NSNotification.Name(rawValue: "DocumentReceived"), object: nil)
}
现在在你的功能
public class func getProductsInShoppingList(name:String = "Default") -> DocumentSnapshot?{
let db = Firestore.firestore()
let defaults = UserDefaults.standard
let userId: String! = defaults.string(forKey: "UserUUID")
var doc:DocumentSnapshot?
db.collection("shoppingLists")
.whereField("users." + userId, isEqualTo: true)
.whereField("name", isEqualTo: name)
.limit(to: 1)
.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
doc = document
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "DocumentReceived"), object: nil)
break
}
}
}
return doc
}
当Notification Observer获得该通知时 - 因此,将自动调用所需的函数
@objc func loadList(){
//load data here
}
注意 - 不要忘记删除添加的Observer不需要时
操作完成后,第二个选项加载数据
public class func getProductsInShoppingList(name:String = "Default") -> DocumentSnapshot?{
let db = Firestore.firestore()
let defaults = UserDefaults.standard
let userId: String! = defaults.string(forKey: "UserUUID")
var doc:DocumentSnapshot?
db.collection("shoppingLists")
.whereField("users." + userId, isEqualTo: true)
.whereField("name", isEqualTo: name)
.limit(to: 1)
.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
doc = document
DispatchQueue.main.async {
//Load data here
}
break
}
}
}
return doc
}