Im trying to wait for the function to process in order to show my image. I have try many things but none of this worked. I know this is an async function and basically i have to wait in order to get the right values but I dont know how to fix this function right here. I hope you can help me out. Thank you!
     func createListProductsGood(Finished() -> void) {
        refProducts.child("Products").queryOrderedByKey().observe(.childAdded, with: { snapshot in
            let prod = snapshot.value as! NSDictionary
            let active = snapshot.key
            let rejected = prod["NotInterested"] as! String
            let photoURL = prod["photoURL"] as! String
            var findit = false
           // print(rejected)
            if (rejected != self.userUID){
                //print(active)
                if rejected.contains(","){
                     var pointsArr = rejected.components(separatedBy: ",")
                        for x in pointsArr{
                                if x.trimmingCharacters(in: NSCharacterSet.whitespaces) == self.userUID {
                                   // print("dont show")
                                    findit = true
                                    return
                                }
                            }
                    if (findit == false){
                        if let url = NSURL(string: photoURL) {
                            if let data = NSData(contentsOf: url as URL) {
                                self.ProductId = active
                                self.productPhoto.image = UIImage(data: data as Data)
                            }}
                    }
                }else{
                    print(active)
                    if let url = NSURL(string: photoURL) {
                        if let data = NSData(contentsOf: url as URL) {
                            self.ProductId = active
                            self.productPhoto.image = UIImage(data: data as Data)
                        }}
                }
            }
               })
    finished()
}
Edited:
This is how my viewDidLoad looks like:
override func viewDidLoad() {
    super.viewDidLoad()
    setAcceptedOrRejected()
    createListProductsGood{_ in
    }
}
 func createListProductsGood(finished: @escaping (_ imageData: Data) -> Void) {
        refProducts.child("Products").queryOrderedByKey().observe(.childAdded, with: { snapshot in
            let prod = snapshot.value as! NSDictionary
            let active = snapshot.key
            let rejected = prod["NotInterested"] as! String
            let photoURL = prod["photoURL"] as! String
            var findit = false
           // print(rejected)
            if (rejected != self.userUID){
                //print(active)
                if rejected.contains(","){
                     var pointsArr = rejected.components(separatedBy: ",")
                        for x in pointsArr{
                                if x.trimmingCharacters(in: NSCharacterSet.whitespaces) == self.userUID {
                                   // print("dont show")
                                    findit = true
                                    return
                                }
                            }
                    if (findit == false){
                        if let url = NSURL(string: photoURL) {
                            if let data = NSData(contentsOf: url as URL) {
                                self.ProductId = active
                                DispatchQueue.main.async {
                                    self.productPhoto.image = UIImage(data: data as Data)
                                }
                            }}
                    }
                }else{
                    print(active)
                    if let url = NSURL(string: photoURL) {
                        if let data = NSData(contentsOf: url as URL) {
                            self.ProductId = active
                            DispatchQueue.main.async {
                             self.productPhoto.image = UIImage(data: data as Data)
                            }
                        }}
                }
        }
             })
}
This is my second method:
func setAcceptedOrRejected() {
    refProducts.child("Products").queryOrderedByKey().observe(.childAdded, with: { snapshot in
        let prod = snapshot.value as! NSDictionary
        if self.ProductId == snapshot.key{
            self.texto = prod["NotInterested"] as! String
            self.refProducts.child("Products").child(self.ProductId).updateChildValues(["NotInterested": self.texto + ", " + self.userUID])
        } })
}
 
     
    