// // LLCache.swift import Foundation import UIKit class LLCache: NSCache { static let shared: LLCache = LLCache() weak var activeTask: URLSessionDataTask? override init() { super.init() self.name = "com.livelike.gif_cache" } func retreiveDataFromUrl(url: URL, completion: @escaping (UIImage?) -> Void) { let path = url.path if let stored = self.object(forKey: path as NSString) { completion(stored) return } activeTask = GiphyApiManager.shared.getData(url: url) { [weak self] data in var preparedImage: UIImage? if let data = data { preparedImage = self?.prepareData(data: data) if preparedImage != nil { self?.setObject(preparedImage!, forKey: path as NSString) } } completion(preparedImage) } } func cancelTaskFor(url: URL) { GiphyApiManager.shared.cancelDataTaskForUrl(url: url) } /*! Prepare the gif before saving it. The loading will be faster. */ private func prepareData(data: Data) -> UIImage? { guard let source = CGImageSourceCreateWithData(data as CFData, nil) else { return nil } var images = [UIImage]() let imageCount = CGImageSourceGetCount(source) for i in 0 ..< imageCount { if let image = CGImageSourceCreateImageAtIndex(source, i, nil) { let img = self.drawInContext(image: UIImage(cgImage: image)) images.append(img) } } let animatedImage = UIImage.animatedImage(with: images, duration: TimeInterval(images.count * (1/15))) return animatedImage } private func drawInContext(image: UIImage) -> UIImage { UIGraphicsBeginImageContextWithOptions(image.size, true, 1) image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } }