amir-f
amir-f

Reputation: 731

Downloaded picture takes a very long time to be shown on UIImageView

I have two UIImageView objects on my view stored inside an array called imgViews and I try to download images for them asynchronously with this code:

   func showPic(positionIndex: Int){
    let urlStr = "https://www.friendesque.com/arranged/userpics/amir/1"
    let url = NSURL(string: urlStr)
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in

        if error == nil {
            self.imgViews[positionIndex].image = UIImage(data: data)
            //self.imgViews[positionIndex].image = UIImage(named: "11665489_10154101221228009_2542754962143804380_n.jpg")
            print("Loading Done...")

        }
        else{
            print(error)
        }
    })
        task.resume()
}

and inside my viewDidLoad(), I have

   showPic(0)

When I run the code, I see "Loading Done..." immediately which means the picture has been loaded but it takes a very long time (about 1 min) for the UIImageView to actually change to the loaded picture. It's a very small picture (~15K) and it can't be a processing time problem.

I tried loading a resource image (the comment part of the code) instead of the downloaded picture but it's still slow.

I'm really confused. Why is swift so slow at working with images inside a block?

Upvotes: 0

Views: 191

Answers (1)

Robert Wagstaff
Robert Wagstaff

Reputation: 2674

Perhaps when the data task returns it is on a background thread? You will need to switch to the main thread to change a UIImageView. Regardless I would use the UIImageView+AFNetworking category to achieve this. It's simple, well tested and lets you provide a placeholder image to display while it is downloading.

https://github.com/AFNetworking/AFNetworking/blob/master/UIKit%2BAFNetworking/UIImageView%2BAFNetworking.h

to use:

myImageView.setImageWithURL(url!)

Upvotes: 1

Related Questions