Skip to content

Instantly share code, notes, and snippets.

@yashthaker7
Last active August 2, 2018 06:13
Show Gist options
  • Save yashthaker7/3b30dce0c3fe3563a60557abdfb50703 to your computer and use it in GitHub Desktop.
Save yashthaker7/3b30dce0c3fe3563a60557abdfb50703 to your computer and use it in GitHub Desktop.
Download image from url, cache & set to imageView
//
// 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