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

时间:2020-06-20 23:47:10

标签: swift firebase swiftui completionhandler

我正在尝试根据从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
}

1 个答案:

答案 0 :(得分:4)

您不能等待异步方法完成。您需要在方法中添加完成处理程序:

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

}