Advertisement
Guest User

sw

a guest
Sep 15th, 2015
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.06 KB | None | 0 0
  1. import UIKit
  2.  
  3. @objc public protocol AFImageCacheProtocol:class{
  4. func cachedImageForRequest(request:NSURLRequest) -> UIImage?
  5. func cacheImage(image:UIImage, forRequest request:NSURLRequest);
  6. }
  7.  
  8. extension UIImageView {
  9. private struct AssociatedKeys {
  10. static var SharedImageCache = "SharedImageCache"
  11. static var RequestImageOperation = "RequestImageOperation"
  12. static var URLRequestImage = "UrlRequestImage"
  13. }
  14.  
  15. public class func setSharedImageCache(cache:AFImageCacheProtocol?) {
  16. objc_setAssociatedObject(self, &AssociatedKeys.SharedImageCache, cache, UInt(OBJC_ASSOCIATION_RETAIN))
  17. }
  18.  
  19. public class func sharedImageCache() -> AFImageCacheProtocol {
  20. struct Static {
  21. static var token : dispatch_once_t = 0
  22. static var defaultImageCache:AFImageCache?
  23. }
  24.  
  25. dispatch_once(&Static.token, { () -> Void in
  26. Static.defaultImageCache = AFImageCache()
  27. NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationDidReceiveMemoryWarningNotification, object: nil, queue: NSOperationQueue.mainQueue()) { (NSNotification) -> Void in
  28. Static.defaultImageCache!.removeAllObjects()
  29. }
  30. })
  31. return objc_getAssociatedObject(self, &AssociatedKeys.SharedImageCache) as? AFImageCacheProtocol ?? Static.defaultImageCache!
  32. }
  33.  
  34. private class func af_sharedImageRequestOperationQueue() -> NSOperationQueue {
  35. struct Static {
  36. static var token:dispatch_once_t = 0
  37. static var queue:NSOperationQueue?
  38. }
  39.  
  40. dispatch_once(&Static.token, { () -> Void in
  41. Static.queue = NSOperationQueue()
  42. Static.queue!.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount
  43. })
  44. return Static.queue!
  45. }
  46.  
  47. private var af_requestImageOperation:(operation:NSOperation?, request: NSURLRequest?) {
  48. get {
  49. let operation:NSOperation? = objc_getAssociatedObject(self, &AssociatedKeys.RequestImageOperation) as? NSOperation
  50. let request:NSURLRequest? = objc_getAssociatedObject(self, &AssociatedKeys.URLRequestImage) as? NSURLRequest
  51. return (operation, request)
  52. }
  53. set {
  54. objc_setAssociatedObject(self, &AssociatedKeys.RequestImageOperation, newValue.operation, UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
  55. objc_setAssociatedObject(self, &AssociatedKeys.URLRequestImage, newValue.request, UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
  56. }
  57. }
  58.  
  59. public func setImageWithUrl(url:NSURL, placeHolderImage:UIImage? = nil) {
  60. let request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
  61. request.addValue("image/*", forHTTPHeaderField: "Accept")
  62. self.setImageWithUrlRequest(request, placeHolderImage: placeHolderImage, success: nil, failure: nil)
  63. }
  64.  
  65. public func setImageWithUrlRequest(request:NSURLRequest, placeHolderImage:UIImage? = nil,
  66. success:((request:NSURLRequest?, response:NSURLResponse?, image:UIImage, fromCache:Bool) -> Void)?,
  67. failure:((request:NSURLRequest?, response:NSURLResponse?, error:NSError) -> Void)?)
  68. {
  69. self.cancelImageRequestOperation()
  70.  
  71. if let cachedImage = UIImageView.sharedImageCache().cachedImageForRequest(request) {
  72. if success != nil {
  73. success!(request: nil, response:nil, image: cachedImage, fromCache:true)
  74. }
  75. else {
  76. self.image = cachedImage
  77. }
  78.  
  79. return
  80. }
  81.  
  82. if placeHolderImage != nil {
  83. self.image = placeHolderImage
  84. }
  85.  
  86. self.af_requestImageOperation = (NSBlockOperation(block: { () -> Void in
  87. var response:NSURLResponse?
  88. var error:NSError?
  89. let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error)
  90. dispatch_async(dispatch_get_main_queue(), { () -> Void in
  91. if request.URL!.isEqual(self.af_requestImageOperation.request?.URL) {
  92. var image:UIImage? = (data != nil ? UIImage(data: data!) : nil)
  93. if image != nil {
  94. if success != nil {
  95. success!(request: request, response: response, image: image!, fromCache:false)
  96. }
  97. else {
  98. self.image = image!
  99. }
  100. UIImageView.sharedImageCache().cacheImage(image!, forRequest: request)
  101. }
  102. else {
  103. if failure != nil {
  104. failure!(request: request, response:response, error: error!)
  105. }
  106. }
  107.  
  108. self.af_requestImageOperation = (nil, nil)
  109. }
  110. })
  111. }), request)
  112.  
  113. UIImageView.af_sharedImageRequestOperationQueue().addOperation(self.af_requestImageOperation.operation!)
  114. }
  115.  
  116. private func cancelImageRequestOperation() {
  117. self.af_requestImageOperation.operation?.cancel()
  118. self.af_requestImageOperation = (nil, nil)
  119. }
  120. }
  121.  
  122. func AFImageCacheKeyFromURLRequest(request:NSURLRequest) -> String {
  123. return request.URL!.absoluteString!
  124. }
  125.  
  126. class AFImageCache: NSCache, AFImageCacheProtocol {
  127. func cachedImageForRequest(request: NSURLRequest) -> UIImage? {
  128. switch request.cachePolicy {
  129. case NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData,
  130. NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData:
  131. return nil
  132. default:
  133. break
  134. }
  135.  
  136. return self.objectForKey(AFImageCacheKeyFromURLRequest(request)) as? UIImage
  137. }
  138.  
  139. func cacheImage(image: UIImage, forRequest request: NSURLRequest) {
  140. self.setObject(image, forKey: AFImageCacheKeyFromURLRequest(request))
  141. }
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement