嵌套的完成处理程序,它不返回要发送到TableViewController的项

问题描述 投票:0回答:1

我想从firebaseFirestore获取一些数据并从firebaseStorage下载一个图像URL,同时准备我的segue,它将把用户带到TableViewController,它们将在那里显示。即使使用一些嵌套的完成处理程序(也许我使代码太长),我仍然无法按顺序执行我的异步任务,因此对于segue来说太早了。为简单起见,我使用的是单个segue(无标识符)。在ViewControllerForTable中,我已经声明了一个变量var cells:[Cella] = [] global。

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)
        })

    }
}
swift xcode completionhandler
1个回答
0
投票

如果我正确理解您的问题,请在此处执行以下操作:

断开故事板中按钮的segue。

在按钮的IBAction功能中,你的prepareDataForSegue工作

调用完成处理程序后,调用performSegue,它将调用prepareSegue,您可以在其中分配下载的cella。

这应该仅在数据可用时加载tableVC。

© www.soinside.com 2019 - 2024. All rights reserved.