Вложенные обработчики завершения, которые не возвращают элементы для отправки в TableViewController - PullRequest
0 голосов
/ 04 апреля 2019

Я хочу получить некоторые данные из firebaseFirestore и загрузить URL-адрес изображения из firebaseStorage, готовясь к моей работе, которая приведет пользователя к TableViewController, где они будут отображаться. Даже при использовании некоторых вложенных обработчиков завершения (возможно, я сделал код слишком длинным), я все еще не могу выполнять свои асинхронные задачи по порядку, поэтому слишком рано спешу к переходу. Для простоты я использую одиночный переход (без идентификаторов). В ViewControllerForTable я указал переменную ячейки var: [Cella] = [] глобально.

let firestoreUsersReference = Firestore.firestore().collection("users")
let storageReference = Storage.storage()



override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    let destinationVC = segue.destination as! ViewControllerForTable

    prepareDataForSegue(firestoreReference: firestoreUsersReference) { (cella) in
        destinationVC.cells = cella
        print(destinationVC.cells)
    }
}



func getImagesDownloaded(reference: StorageReference, completion: @escaping (UIImage?,Error?)->()) {
    reference.getData(maxSize: 10*1024*1024) { (data, error) in
        guard error == nil, let data = data else {
            completion(nil,error)
            return
        }
        guard let image = UIImage(data: data) else {
            completion(nil, FirebaseErrors.expectedImage)
            return
        }
        completion(image,nil)
    }
}
enum FirebaseErrors: Error {
    case expectedImage
}

func prepareDataForSegue (firestoreReference: CollectionReference, completion : @escaping ([Cella])->()) {
    var cellaArray : [Cella] = []
    firestoreUsersReference.getDocuments { (querySnapshot, err) in
        if err != nil {
            print("There has been an error \(String(describing: err?.localizedDescription))")
        }
        else {
            self.getDocumentsFromFirestore(querySnapshot: querySnapshot, completion: { (title, description, image) in
                let newCell = Cella(image: image, title: title, bodyMessage: description)
                print("NEW CELL : \(newCell)")
                cellaArray.append(newCell)
            })
        }
    }
    completion(cellaArray)
}


func getDocumentsFromFirestore (querySnapshot: QuerySnapshot?, completion: @escaping (String,String,UIImage)->()) {
    for documents in querySnapshot!.documents {
        print("\(documents.documentID) => \(documents.data())")

        let data = documents.data()
        let title = data["userTitle"] as? String
        let description = data["userDescription"] as? String
        let imageURL = data["userImageURL"] as! String
        print("Title: \(String(describing: title)), Description: \(String(describing: description)), imageURL: \(imageURL)")
        let storagePath = Storage.storage().reference(forURL: imageURL)

        self.getImagesDownloaded(reference: storagePath, completion: { (image, error) in
            guard let image = image, error == nil else {
                print(String(describing : error?.localizedDescription))
                return
            }
            print("TITLE: \(String(describing: title)), IMAGE: \(image)")
            completion(title!, description!, image)
        })

    }
}

1 Ответ

0 голосов
/ 04 апреля 2019

Если я правильно понимаю ваш вопрос, вот что вам нужно сделать:

Отключите переход к кнопке в раскадровке.

В функции IBAction для кнопки выполните prepareDataForSegue работу

Как только обработчик завершения вызывается, вызовите performSegue, который вызовет prepareSegue, где вы можете назначить загруженную целлу.

Это должно загружать tableVC только при наличии данных.

...