From 20dd53a714c25430b123c7133a94f026fdf77a26 Mon Sep 17 00:00:00 2001 From: Ben Scheirman Date: Sat, 11 Feb 2017 14:14:34 -0600 Subject: [PATCH] Add internal shared image cache to remote image view --- .../FiveCalls/IssueDetailViewController.swift | 6 ++--- FiveCalls/FiveCalls/RemoteImageView.swift | 27 ++++++++++++++++++- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/FiveCalls/FiveCalls/IssueDetailViewController.swift b/FiveCalls/FiveCalls/IssueDetailViewController.swift index 6cfbdaa1..1cff21a4 100644 --- a/FiveCalls/FiveCalls/IssueDetailViewController.swift +++ b/FiveCalls/FiveCalls/IssueDetailViewController.swift @@ -15,8 +15,7 @@ class IssueDetailViewController : UIViewController, IssueShareable { var issuesManager: IssuesManager! var issue: Issue! var logs: ContactLogs? - internal var images = [String: UIImage]() - + @IBOutlet weak var tableView: UITableView! override var preferredStatusBarStyle: UIStatusBarStyle { @@ -112,8 +111,7 @@ extension IssueDetailViewController : UITableViewDataSource { cell.nameLabel.text = contact.name cell.subtitleLabel.text = contact.area if let photoURL = contact.photoURL { - let imageKey = photoURL.absoluteString - cell.avatarImageView.setRemoteImage(preferred: images[imageKey], url: photoURL, completion: { self.images[imageKey] = $0 }) + cell.avatarImageView.setRemoteImage(url: photoURL) } else { cell.avatarImageView.image = cell.avatarImageView.defaultImage } diff --git a/FiveCalls/FiveCalls/RemoteImageView.swift b/FiveCalls/FiveCalls/RemoteImageView.swift index 6cce4c12..cf293405 100644 --- a/FiveCalls/FiveCalls/RemoteImageView.swift +++ b/FiveCalls/FiveCalls/RemoteImageView.swift @@ -31,11 +31,15 @@ class RemoteImageView : UIImageView { } func setRemoteImage(url: URL, completion: @escaping RemoteImageCallback) { - image = defaultImage setRemoteImage(preferred: defaultImage, url: url, completion: completion) } func setRemoteImage(preferred preferredImage: UIImage?, url: URL, completion: @escaping RemoteImageCallback) { + if let cachedImage = ImageCache.shared.image(forKey: url) { + image = cachedImage + return + } + image = preferredImage guard preferredImage == nil || preferredImage == defaultImage else { return completion(preferredImage!) @@ -56,6 +60,7 @@ class RemoteImageView : UIImageView { if http.statusCode == 200 { if let data = data, let image = UIImage(data: data) { self.currentImageURL = url + ImageCache.shared.set(image: image, forKey: url) DispatchQueue.main.async { completion(image) } @@ -68,3 +73,23 @@ class RemoteImageView : UIImageView { currentTask?.resume() } } + +private struct ImageCache { + static var shared = ImageCache() + + private let cache: NSCache + + init() { + cache = NSCache() + } + + func image(forKey key:URL) -> UIImage? { + return cache.object(forKey: key.absoluteString as NSString) + } + + func set(image: UIImage, forKey key: URL) { + cache.setObject(image, forKey: key.absoluteString as NSString) + } + + +}