swiftfirebasemkmapviewmapkitmkpointannotation

How do I update an MKPointAnnotation image after downloading the right image?


I have a bunch of annotations on a map, which all have a custom photos. Some of the photos may not be downloaded to the application yet from Firebase, so if they do not the image available, it defaults to a white circle image and initiates a download. When the download completes, it does not set the new image. How can I go about this?

Heres some code:

func generateAnnotations() {
    for photo in photos {
        let annotation = DetailPhotoPointAnnotation()
        let latitude = photo.latitude
        let longitude = photo.longitude
        annotation.coordinate.latitude = latitude
        annotation.coordinate.longitude = longitude
        if photo.image != nil {
            annotation.image = photo.image
        } else {
            annotation.image = #imageLiteral(resourceName: "whiteCircle")
            let path = getDocumentsDirectory().appendingPathComponent(photo.uid)
            if let image = UIImage(contentsOfFile: path) {
                annotation.image = image
            } else {
                let ref = FIRStorage.storage().reference(forURL: photo.imageUrl)
                ref.data(withMaxSize: 5*1024*1024, completion: { (data, error) in
                    if error != nil {
                        print(error!)
                    } else {
                        if let imageData = data {
                            if let image = UIImage(data: imageData) {
                                photo.assignImage(image: image)
                                annotation.image = image
                            }
                        }
                    }
                })
            }
        }
        self.coordinates.append(CLLocationCoordinate2DMake(latitude, longitude))
        self.mapView.addAnnotation(annotation)
    }
    generateOverlay()
}

As you can see, it first looks to if the photo object contains an image. If it doesn't, it looks in the documents directory for that image. If its not there, it will finally download it. Any suggestions?


Solution

  • You need to do something like this. Go to main thread. And then update

    DispatchQueue.main.async(execute: {
        imageView.image = image
    })
    

    In my solution it works. Hope this helps.