LLCache.swift 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //
  2. // LLCache.swift
  3. import Foundation
  4. import UIKit
  5. class LLCache: NSCache <NSString, UIImage> {
  6. static let shared: LLCache = LLCache()
  7. weak var activeTask: URLSessionDataTask?
  8. override init() {
  9. super.init()
  10. self.name = "com.livelike.gif_cache"
  11. }
  12. func retreiveDataFromUrl(url: URL, completion: @escaping (UIImage?) -> Void) {
  13. let path = url.path
  14. if let stored = self.object(forKey: path as NSString) {
  15. completion(stored)
  16. return
  17. }
  18. activeTask = GiphyApiManager.shared.getData(url: url) { [weak self] data in
  19. var preparedImage: UIImage?
  20. if let data = data {
  21. preparedImage = self?.prepareData(data: data)
  22. if preparedImage != nil {
  23. self?.setObject(preparedImage!, forKey: path as NSString)
  24. }
  25. }
  26. completion(preparedImage)
  27. }
  28. }
  29. func cancelTaskFor(url: URL) {
  30. GiphyApiManager.shared.cancelDataTaskForUrl(url: url)
  31. }
  32. /*!
  33. Prepare the gif before saving it.
  34. The loading will be faster.
  35. */
  36. private func prepareData(data: Data) -> UIImage? {
  37. guard let source = CGImageSourceCreateWithData(data as CFData, nil) else { return nil }
  38. var images = [UIImage]()
  39. let imageCount = CGImageSourceGetCount(source)
  40. for i in 0 ..< imageCount {
  41. if let image = CGImageSourceCreateImageAtIndex(source, i, nil) {
  42. let img = self.drawInContext(image: UIImage(cgImage: image))
  43. images.append(img)
  44. }
  45. }
  46. let animatedImage = UIImage.animatedImage(with: images, duration: TimeInterval(images.count * (1/15)))
  47. return animatedImage
  48. }
  49. private func drawInContext(image: UIImage) -> UIImage {
  50. UIGraphicsBeginImageContextWithOptions(image.size, true, 1)
  51. image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
  52. let newImage = UIGraphicsGetImageFromCurrentImageContext()
  53. UIGraphicsEndImageContext()
  54. return newImage!
  55. }
  56. }