Как вернуть массив в Swift после добавления к нему материала? - PullRequest
1 голос
/ 21 июня 2020

Я пытаюсь создать массив элементов на основе данных, которые я загружаю из коллекции документов в 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 Ответ

4 голосов
/ 21 июня 2020

Вы не можете дождаться завершения асинхронного метода sh. Вам нужно добавить в свой метод обработчик завершения:

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

}
...