如何在Swift中添加内容后返回数组?

如何在Swift中添加内容后返回数组?,swift,firebase,swiftui,completionhandler,Swift,Firebase,Swiftui,Completionhandler,我正试图根据从Firebase上的文档集合下载的数据构建一个项目数组。我从一个空数组开始,然后根据从该文档下载的数据为每个文档创建一个项,并将该项附加到数组中。但是,它返回一个空数组。我有一种感觉,我需要用一个完成处理器来做一些事情,但我不太明白这是怎么做到的。下面是我的代码。谢谢 func getDayData() -> [Item] { var myList = [Item]() let docs = Firestore.firestore().collection(&

我正试图根据从Firebase上的文档集合下载的数据构建一个项目数组。我从一个空数组开始,然后根据从该文档下载的数据为每个文档创建一个项,并将该项附加到数组中。但是,它返回一个空数组。我有一种感觉,我需要用一个完成处理器来做一些事情,但我不太明白这是怎么做到的。下面是我的代码。谢谢

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。。