Skip to content

Instantly share code, notes, and snippets.

@mjhassan
Created September 3, 2019 04:42
Show Gist options
  • Select an option

  • Save mjhassan/4d50456b270cf86b7499c43fee158adf to your computer and use it in GitHub Desktop.

Select an option

Save mjhassan/4d50456b270cf86b7499c43fee158adf to your computer and use it in GitHub Desktop.
Simple custom image view to load image asynchronously
class UIAsyncImageView: UIImageView {
static let imageCache = NSCache<AnyObject, AnyObject>()
// Associated Object property; implementation omitted.
final private var imageUrl: URL?
func loadImage(from urlString: String, placeholder: UIImage? = nil) {
setImage(placeholder)
guard let url = URL(string: urlString) else {
return
}
imageUrl = url
if let cachedImage = UIAsyncImageView.imageCache.object(forKey: url as AnyObject) as? UIImage {
self.setImage(cachedImage)
return
}
APIService().get(url: url) { [weak self] (data, error) in
guard let _imageUrl = self?.imageUrl, _imageUrl == url else {
return
}
guard let data = data, let image = UIImage(data: data) else {
return
}
self?.setImage(image)
UIAsyncImageView.imageCache.setObject(image, forKey: url as AnyObject)
}
}
private func setImage(_ image: UIImage?) {
DispatchQueue.main.async { [weak self] in
self?.image = image
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment