如何在Swift中添加内容后返回数组?
我正试图根据从Firebase上的文档集合下载的数据构建一个项目数组。我从一个空数组开始,然后根据从该文档下载的数据为每个文档创建一个项,并将该项附加到数组中。但是,它返回一个空数组。我有一种感觉,我需要用一个完成处理器来做一些事情,但我不太明白这是怎么做到的。下面是我的代码。谢谢如何在Swift中添加内容后返回数组?,swift,firebase,swiftui,completionhandler,Swift,Firebase,Swiftui,Completionhandler,我正试图根据从Firebase上的文档集合下载的数据构建一个项目数组。我从一个空数组开始,然后根据从该文档下载的数据为每个文档创建一个项,并将该项附加到数组中。但是,它返回一个空数组。我有一种感觉,我需要用一个完成处理器来做一些事情,但我不太明白这是怎么做到的。下面是我的代码。谢谢 func getDayData() -> [Item] { var myList = [Item]() let docs = Firestore.firestore().collection(&
func getDayData() -> [Item] {
var myList = [Item]()
let docs = Firestore.firestore().collection("Users").document("pK0tVBXvbFNhTZic3PIM").collection("Log").document("18-06-2020").collection("Items")
docs.getDocuments() {(querySnapshot, err) in
if let err = err {
//TODO
} else {
for document in querySnapshot!.documents {
myList.append(Item(id: document.documentID, item: document.get("Item") as! String, category: document.get("Category") as! String, pieces: document.get("Pieces") as! Int))
}
}
}
return myList
}
您不能等待异步方法完成。您需要向方法中添加一个完成处理程序:
func getDayData(completion: @escaping ([Item]?, Error?) -> Void) {
Firestore.firestore()
.collection("Users")
.document("pK0tVBXvbFNhTZic3PIM")
.collection("Log")
.document("18-06-2020")
.collection("Items")
.getDocuments() { querySnapshot, error in
let items = querySnapshot?.documents.map {
Item(id: $0.documentID,
item: $0.get("Item") as? String ?? "",
category: $0.get("Category") as? String ?? "",
pieces: $0.get("Pieces") as? Int ?? 0)
}
completion(items, error)
}
}
用法:
getDayData { items, error in
guard let items = items else {
print(error ?? "nil")
return
}
// use items here
}
您不能等待异步方法完成。您需要向方法中添加一个完成处理程序:
func getDayData(completion: @escaping ([Item]?, Error?) -> Void) {
Firestore.firestore()
.collection("Users")
.document("pK0tVBXvbFNhTZic3PIM")
.collection("Log")
.document("18-06-2020")
.collection("Items")
.getDocuments() { querySnapshot, error in
let items = querySnapshot?.documents.map {
Item(id: $0.documentID,
item: $0.get("Item") as? String ?? "",
category: $0.get("Category") as? String ?? "",
pieces: $0.get("Pieces") as? Int ?? 0)
}
completion(items, error)
}
}
用法:
getDayData { items, error in
guard let items = items else {
print(error ?? "nil")
return
}
// use items here
}
你确定那些追加调用真的发生了吗?在那里设置一个断点可能是值得的。他们可能都掉进了待办事项的洞。你确定那些追加调用真的发生了吗?在那里设置一个断点可能是值得的。他们可能都掉进了待办事项的洞里。如果我想显示这些项目的列表呢?我尝试getDayData{items,err in guard let items=items else{printerr??nil return}Listitems{item in ZStack{Textitem.item//OTHER STUFF…}}.padding.trailing},但我得到的错误类型不能符合'View';只有结构/枚举/类类型可以符合协议我不习惯SwiftUI,但可以尝试列出{TextItems ForEachitems{item in Textitem.item}}或者列出{TextItems ForEach0..如果我想显示这些项的列表呢?我尝试getDayData{items,err in guard let items=items else{printerr??nil return}Listitems{ZStack中的item{Textitem.item//OTHER STUFF…}}.padding.trailing},但我得到的错误类型不能符合“视图”;只有struct/enum/类类型可以符合协议我不习惯SwiftUI,但请尝试列出{TextItems ForEachitems{item in Textitem.item}}或可能列出{TextItems ForEach0。。