diff --git a/Tusker/Caching/ImageCache.swift b/Tusker/Caching/ImageCache.swift index f7f54742d6..f772a0d88d 100644 --- a/Tusker/Caching/ImageCache.swift +++ b/Tusker/Caching/ImageCache.swift @@ -15,31 +15,31 @@ class ImageCache { static let headers = ImageCache(name: "Headers", memoryExpiry: .seconds(60 * 60), diskExpiry: .seconds(60 * 60 * 24)) static let attachments = ImageCache(name: "Attachments", memoryExpiry: .seconds(60 * 2)) - let cache: Cache + let cache: Cache var requests = [URL: Request]() init(name: String, memoryExpiry expiry: Expiry) { - let storage = MemoryStorage(config: MemoryConfig(expiry: expiry)) + let storage = MemoryStorage(config: MemoryConfig(expiry: expiry)) self.cache = .memory(storage) } init(name: String, diskExpiry expiry: Expiry) { - let storage = try! DiskStorage(config: DiskConfig(name: name, expiry: expiry), transformer: TransformerFactory.forData()) + let storage = try! DiskStorage(config: DiskConfig(name: name, expiry: expiry), transformer: TransformerFactory.forImage()) self.cache = .disk(storage) } init(name: String, memoryExpiry: Expiry, diskExpiry: Expiry) { - let memory = MemoryStorage(config: MemoryConfig(expiry: memoryExpiry)) - let disk = try! DiskStorage(config: DiskConfig(name: name, expiry: diskExpiry), transformer: TransformerFactory.forData()) + let memory = MemoryStorage(config: MemoryConfig(expiry: memoryExpiry)) + let disk = try! DiskStorage(config: DiskConfig(name: name, expiry: diskExpiry), transformer: TransformerFactory.forImage()) self.cache = .hybrid(HybridStorage(memoryStorage: memory, diskStorage: disk)) } - func get(_ url: URL, completion: ((Data?) -> Void)?) { + func get(_ url: URL, completion: ((UIImage?) -> Void)?) { let key = url.absoluteString if (try? cache.existsObject(forKey: key)) ?? false, - let data = try? cache.object(forKey: key) { - completion?(data) + let image = try? cache.object(forKey: key) { + completion?(image) } else { if let completion = completion, let request = requests[url] { request.callbacks.append(completion) @@ -53,7 +53,7 @@ class ImageCache { } } - func get(_ url: URL) -> Data? { + func get(_ url: URL) -> UIImage? { return try? cache.object(forKey: url.absoluteString) } @@ -64,9 +64,9 @@ class ImageCache { class Request { let url: URL var task: URLSessionDataTask? - var callbacks: [(Data?) -> Void] + var callbacks: [(UIImage?) -> Void] - init(url: URL, completion: ((Data?) -> Void)?) { + init(url: URL, completion: ((UIImage?) -> Void)?) { if let completion = completion { self.callbacks = [completion] } else { @@ -75,14 +75,14 @@ class ImageCache { self.url = url } - func run(cache: @escaping (Data) -> Void) { + func run(cache: @escaping (UIImage) -> Void) { task = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in - guard error == nil, let data = data else { + guard error == nil, let data = data, let image = UIImage(data: data) else { self.complete(with: nil) return } - cache(data) - self.complete(with: data) + cache(image) + self.complete(with: image) }) task!.resume() } @@ -92,8 +92,8 @@ class ImageCache { complete(with: nil) } - func complete(with data: Data?) { - callbacks.forEach { $0(data) } + func complete(with image: UIImage?) { + callbacks.forEach { $0(image) } } } diff --git a/Tusker/Screens/Compose/ComposeViewController.swift b/Tusker/Screens/Compose/ComposeViewController.swift index a11f9ae523..1fefe8a4b9 100644 --- a/Tusker/Screens/Compose/ComposeViewController.swift +++ b/Tusker/Screens/Compose/ComposeViewController.swift @@ -98,10 +98,9 @@ class ComposeViewController: UIViewController { inReplyToAvatarImageView.layer.cornerRadius = Preferences.shared.avatarStyle.cornerRadius(for: inReplyToAvatarImageView) inReplyToAvatarImageView.layer.masksToBounds = true inReplyToAvatarImageView.image = nil - ImageCache.avatars.get(inReplyTo.account.avatar) { (data) in - guard let data = data else { return } + ImageCache.avatars.get(inReplyTo.account.avatar) { (image) in DispatchQueue.main.async { - self.inReplyToAvatarImageView.image = UIImage(data: data) + self.inReplyToAvatarImageView.image = image } } inReplyToLabel.text = "In reply to \(inReplyTo.account.realDisplayName)" diff --git a/Tusker/Views/AttachmentView.swift b/Tusker/Views/AttachmentView.swift index 5913384095..d85aa832f9 100644 --- a/Tusker/Views/AttachmentView.swift +++ b/Tusker/Views/AttachmentView.swift @@ -8,7 +8,6 @@ import UIKit import Pachyderm -import WebKit protocol AttachmentViewDelegate { func showLargeAttachment(for attachmentView: AttachmentView) @@ -44,27 +43,9 @@ class AttachmentView: UIImageView { } func loadImage() { - ImageCache.attachments.get(attachment.url) { (data) in - guard let data = data else { - // TODO: error icon - return - } - - // TODO: better way of detecting gifs - if self.attachment.url.pathExtension == "gif" { - DispatchQueue.main.async { - // I hate this; this is awful - let webView = WKWebView(frame: self.bounds) - webView.isUserInteractionEnabled = false - webView.backgroundColor = .clear - webView.isOpaque = false - webView.load(data, mimeType: "image/gif", characterEncodingName: "utf-8", baseURL: self.attachment.url) - self.addSubview(webView) - } - } else { - DispatchQueue.main.async { - self.image = UIImage(data: data) - } + ImageCache.attachments.get(attachment.url) { (image) in + DispatchQueue.main.async { + self.image = image } } } @@ -74,5 +55,5 @@ class AttachmentView: UIImageView { delegate?.showLargeAttachment(for: self) } } - + } diff --git a/Tusker/Views/Notifications/ActionNotificationTableViewCell.swift b/Tusker/Views/Notifications/ActionNotificationTableViewCell.swift index 67591c1beb..5cf7dcdb44 100644 --- a/Tusker/Views/Notifications/ActionNotificationTableViewCell.swift +++ b/Tusker/Views/Notifications/ActionNotificationTableViewCell.swift @@ -79,19 +79,17 @@ class ActionNotificationTableViewCell: UITableViewCell, PreferencesAdaptive { usernameLabel.text = "@\(status.account.acct)" opAvatarImageView.image = nil opAvatarURL = status.account.avatar - ImageCache.avatars.get(status.account.avatar) { (data) in - guard let data = data else { return } + ImageCache.avatars.get(status.account.avatar) { (image) in DispatchQueue.main.async { - self.opAvatarImageView.image = UIImage(data: data) + self.opAvatarImageView.image = image self.opAvatarURL = nil } } actionAvatarImageView.image = nil actionAvatarURL = notification.account.avatar - ImageCache.avatars.get(notification.account.avatar) { (data) in - guard let data = data else { return } + ImageCache.avatars.get(notification.account.avatar) { (image) in DispatchQueue.main.async { - self.actionAvatarImageView.image = UIImage(data: data) + self.actionAvatarImageView.image = image self.actionAvatarURL = nil } } diff --git a/Tusker/Views/Notifications/FollowNotificationTableViewCell.swift b/Tusker/Views/Notifications/FollowNotificationTableViewCell.swift index 7ca3e29091..fa08623f31 100644 --- a/Tusker/Views/Notifications/FollowNotificationTableViewCell.swift +++ b/Tusker/Views/Notifications/FollowNotificationTableViewCell.swift @@ -51,10 +51,9 @@ class FollowNotificationTableViewCell: UITableViewCell, PreferencesAdaptive { usernameLabel.text = "@\(account.acct)" avatarImageView.image = nil avatarURL = account.avatar - ImageCache.avatars.get(account.avatar) { (data) in - guard let data = data else { return } + ImageCache.avatars.get(account.avatar) { (image) in DispatchQueue.main.async { - self.avatarImageView.image = UIImage(data: data) + self.avatarImageView.image = image self.avatarURL = nil } } diff --git a/Tusker/Views/Profile Header/ProfileHeaderTableViewCell.swift b/Tusker/Views/Profile Header/ProfileHeaderTableViewCell.swift index b6deb8f2fc..47fc7f9e4c 100644 --- a/Tusker/Views/Profile Header/ProfileHeaderTableViewCell.swift +++ b/Tusker/Views/Profile Header/ProfileHeaderTableViewCell.swift @@ -61,17 +61,15 @@ class ProfileHeaderTableViewCell: UITableViewCell, PreferencesAdaptive { avatarImageView.image = nil avatarURL = account.avatar - ImageCache.avatars.get(account.avatar) { (data) in - guard let data = data else { return } + ImageCache.avatars.get(account.avatar) { (image) in DispatchQueue.main.async { - self.avatarImageView.image = UIImage(data: data) + self.avatarImageView.image = image self.avatarURL = nil } } - ImageCache.headers.get(account.header) { (data) in - guard let data = data else { return } + ImageCache.headers.get(account.header) { (image) in DispatchQueue.main.async { - self.headerImageView.image = UIImage(data: data) + self.headerImageView.image = image self.headerURL = nil } } diff --git a/Tusker/Views/Status/ConversationMainStatusTableViewCell.swift b/Tusker/Views/Status/ConversationMainStatusTableViewCell.swift index 234adc2025..d107ccfdf1 100644 --- a/Tusker/Views/Status/ConversationMainStatusTableViewCell.swift +++ b/Tusker/Views/Status/ConversationMainStatusTableViewCell.swift @@ -80,10 +80,9 @@ class ConversationMainStatusTableViewCell: UITableViewCell, PreferencesAdaptive usernameLabel.text = "@\(account.acct)" avatarImageView.image = nil avatarURL = account.avatar - ImageCache.avatars.get(account.avatar) { (data) in - guard let data = data else { return } + ImageCache.avatars.get(account.avatar) { (image) in DispatchQueue.main.async { - self.avatarImageView.image = UIImage(data: data) + self.avatarImageView.image = image self.avatarURL = nil } } diff --git a/Tusker/Views/Status/StatusTableViewCell.swift b/Tusker/Views/Status/StatusTableViewCell.swift index 4ed687dedb..6b74eaada1 100644 --- a/Tusker/Views/Status/StatusTableViewCell.swift +++ b/Tusker/Views/Status/StatusTableViewCell.swift @@ -97,12 +97,10 @@ class StatusTableViewCell: UITableViewCell, PreferencesAdaptive { usernameLabel.text = "@\(account.acct)" avatarImageView.image = nil avatarURL = account.avatar - ImageCache.avatars.get(account.avatar) { (data) in - self.avatarURL = nil - - guard let data = data else { return } + ImageCache.avatars.get(account.avatar) { (image) in DispatchQueue.main.async { - self.avatarImageView.image = UIImage(data: data) + self.avatarImageView.image = image + self.avatarURL = nil } } updateTimestamp()