Skip to content

Commit

Permalink
Add internal shared image cache to remote image view
Browse files Browse the repository at this point in the history
  • Loading branch information
subdigital committed Feb 11, 2017
1 parent e9583fc commit 20dd53a
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 5 deletions.
6 changes: 2 additions & 4 deletions FiveCalls/FiveCalls/IssueDetailViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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
}
Expand Down
27 changes: 26 additions & 1 deletion FiveCalls/FiveCalls/RemoteImageView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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!)
Expand All @@ -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)
}
Expand All @@ -68,3 +73,23 @@ class RemoteImageView : UIImageView {
currentTask?.resume()
}
}

private struct ImageCache {
static var shared = ImageCache()

private let cache: NSCache<NSString, UIImage>

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)
}


}

0 comments on commit 20dd53a

Please sign in to comment.