1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- //
- // LLCache.swift
- import Foundation
- import UIKit
- class LLCache: NSCache <NSString, UIImage> {
-
- 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!
- }
-
- }
|