Last active
August 2, 2018 06:13
-
-
Save yashthaker7/3b30dce0c3fe3563a60557abdfb50703 to your computer and use it in GitHub Desktop.
Download image from url, cache & set to imageView
This file contains 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
// | |
// CachedImageView.swift | |
// | |
// Created by Yash Thaker on 01/01/18. | |
// Copyright © 2018 YashThaker. All rights reserved. | |
// | |
import UIKit | |
open class CachedImageView: UIImageView { | |
open static let imageCache = NSCache<NSString, UIImage>() | |
private var urlStringForChecking: String? | |
open func loadImage(urlString: String, completion: (() -> ())? = nil) { | |
startLoading() | |
image = nil | |
self.urlStringForChecking = urlString | |
if let cachedItem = CachedImageView.imageCache.object(forKey: urlString as NSString) { | |
image = cachedItem | |
stopLoading() | |
completion?() | |
return | |
} | |
guard let url = URL(string: urlString) else { return } | |
URLSession.shared.dataTask(with: url, completionHandler: { [weak self] (data, response, error) in | |
if error != nil { | |
DispatchQueue.main.async { self?.stopLoading() } | |
return | |
} | |
DispatchQueue.main.async { | |
if let data = data, let image = UIImage(data: data) { | |
CachedImageView.imageCache.setObject(image, forKey: urlString as NSString) | |
if urlString == self?.urlStringForChecking { | |
self?.image = image | |
self?.stopLoading() | |
completion?() | |
} | |
} else { | |
self?.stopLoading() | |
} | |
} | |
}).resume() | |
} | |
open func clearCachedImageFromUrl(_ urlString: String) { | |
CachedImageView.imageCache.removeObject(forKey: urlString as NSString) | |
} | |
// loading indicator | |
private let activityIndicator: UIActivityIndicatorView = { | |
let ai = UIActivityIndicatorView(activityIndicatorStyle: .gray) | |
ai.translatesAutoresizingMaskIntoConstraints = false | |
ai.isHidden = true | |
return ai | |
}() | |
open override func layoutSubviews() { | |
super.layoutSubviews() | |
self.addSubview(activityIndicator) | |
activityIndicator.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true | |
activityIndicator.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true | |
} | |
private func startLoading() { activityIndicator.startAnimating() } | |
private func stopLoading() { activityIndicator.stopAnimating() } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment