Created
September 3, 2019 04:42
-
-
Save mjhassan/4d50456b270cf86b7499c43fee158adf to your computer and use it in GitHub Desktop.
Simple custom image view to load image asynchronously
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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