Swift版本的图片加载类

简介:

之前使用OC版本的,都是基于AFN而自行封装的类库,

现在写了一个swift版本的,很方便使用,在些开源出来。


首先是图片下载类:

//
//  HYBImageLoader.swift
//  OSChinaClient
//
//  Created by 黄仪标 on 15/3/5.
//  Copyright (c) 2015年 huangyibiao free edu. All rights reserved.
//

import Foundation
import UIKit

///
/// 图片下载类,使用NSCache作为缓存处理
///
/// 作者:黄仪标
///
/// Email: 632840804@qq.com
///
/// github:https://github.com/632840804
///
/// CSDN Blog: http://blog.csdn.net/woaifen3344/
///
/// Note:有任何可以,可以通过Email反馈,会在空闲时间处理,谢谢!
///
class HYBImageLoader {
  /// 缓存处理对象
  var cache = NSCache()
  
  ///
  /// 声明为单例
  ///
  class var sharedInstance : HYBImageLoader {
    struct Loader {
      static let instance = HYBImageLoader()
    }
    return Loader.instance
  }
  
  ///
  /// 加载图片
  ///
  /// url 图片请求地址
  ///
  /// completion 加载完成时的回调,不论是加载成功还是加载失败,都会回调
  ///            image 可空类型,为nil表示加载失败,不为nil,表示加载成功
  ///            isFromCache Bool类型,表示是否是从缓存中提取出来的图片
  func loadImage(url: String, completionHandler:(image: UIImage?, isFromCache: Bool) -> ()) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {()in
      var data: NSData? = self.cache.objectForKey(url.md5ForLoader) as? NSData
      
      if let goodData = data {
        let image = UIImage(data: goodData)
        dispatch_async(dispatch_get_main_queue(), {() in
          completionHandler(image: image, isFromCache: true)
        })
        return
      }
      
      var downloadTask: NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)!, completionHandler: {(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
        if (error != nil) {
          completionHandler(image: nil, isFromCache: false);
          return
        }
        
        if data != nil {
          let image = UIImage(data: data)
          self.cache.setObject(data, forKey: url.md5ForLoader)
          dispatch_async(dispatch_get_main_queue(), {() in
            completionHandler(image: image, isFromCache: false)
          })
          return
        }
        
      });
      downloadTask.resume()
    })
  }
}

///
/// String结构通用功能扩展
///
extension String {
  ///
  /// 获取自身md5加密后的字符串
  ///
  var md5ForLoader : String {
    let str = self.cStringUsingEncoding(NSUTF8StringEncoding)
    let strLen = CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
    let digestLen = Int(CC_MD5_DIGEST_LENGTH)
    let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen);
    
    CC_MD5(str!, strLen, result);
    
    var hash = NSMutableString();
    for i in 0 ..< digestLen {
      hash.appendFormat("%02x", result[i]);
    }
    result.destroy();
    
    return String(format: hash)
  }
}

接下来就是图片加载控件类:

//
//  HYBLoadingImageView.swift
//  OSChinaClient
//
//  Created by 黄仪标 on 15/3/5.
//  Copyright (c) 2015年 huangyibiao free edu. All rights reserved.
//

import Foundation
import UIKit

typealias HYBImageLoadingCompletion = (image: UIImage?) -> ();
typealias HYBImageCompletion = (image: UIImage?, isFromCache: Bool) -> ();

///
/// 图片加载控件,所有需要到网络加载的图片,都需要使用此控件操作
///
/// 作者:黄仪标
///
/// Email: 632840804@qq.com
///
/// github:https://github.com/632840804
///
/// CSDN Blog: http://blog.csdn.net/woaifen3344/
///
/// Note:有任何可以,可以通过Email反馈,会在空闲时间处理,谢谢!
///
class HYBLoadingImageView: UIImageView {
  override convenience init() {
    self.init(frame: CGRectZero);
  }
  
  override init(frame: CGRect) {
    super.init(frame: frame);
    
    self.clipsToBounds = true;
    self.layer.masksToBounds = true;
  }
  
  required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder);
    
    self.clipsToBounds = true;
    self.layer.masksToBounds = true;
  }
  
  ///
  /// 是否将图片控件显示为圆形
  ///
  /// isCircle true表示显示为圆
  ///
  func isCircle(isCircle: Bool = false) {
      if isCircle == true {
        var width = min(self.frame.size.width, self.frame.size.height);
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, width, width);
        self.layer.cornerRadius = width / 2;
      }
  }
  
  ///
  /// 加载图片
  ///
  /// url 图片请求地址
  ///
  func loadImage(url: String) {
    self.loadImage(url, holder: "");
  }
  
  ///
  /// 加载图片
  ///
  /// url 图片请求地址
  ///
  /// holder 占位图片名称
  ///
  func loadImage(url: String, holder: String) {
    self.loadImage(url, holder: holder, completion: nil);
  }
  
  ///
  /// 加载图片
  ///
  /// url 图片请求地址
  ///
  /// completion 图片加载完成时的回调闭包
  ///
  func loadImage(url: String, completion: HYBImageLoadingCompletion?) {
    self.loadImage(url, holder: "", completion: completion);
  }
  
  ///
  /// 加载图片
  ///
  /// url 图片请求地址
  ///
  /// holder 占位图片名称
  ///
  /// completion 图片加载完成时的回调闭包
  ///
  func loadImage(url: String, holder: String, completion: HYBImageLoadingCompletion?) {
    if !holder.isEmpty {
      self.image = UIImage(named: holder);
    }
    
    if url.isEmpty {
      completion?(image: nil);
      return;
    }
    
    HYBImageLoader.sharedInstance.loadImage(url, completionHandler: { (image, isFromCache) -> () in
      if image == nil { // 图片加载失败
        completion?(image: nil);
      } else {
        println(url);
        
        // 在图片加载成功后,如果处理添加图片显示的动画处理,如果在此处添加
        if !isFromCache {
          // 添加淡入淡出的动画效果
          let animation = CATransition();
          animation.duration = 0.65;
          animation.type = kCATransitionFade;
          animation.removedOnCompletion = true;
          self.layer.addAnimation(animation, forKey: "transition");
        }
        
        self.image = image;
        completion?(image: image);
      }
    });
  }
}

github下载地址: https://github.com/632840804/SwiftImageView/tree/master



目录
相关文章
|
11天前
|
Swift 索引 容器
Swift 泛型-关联类
Swift 泛型-关联类
18 1
|
28天前
|
Swift
Swift 中 struct(结构体)和 class(类)的区别
【10月更文挑战第10天】理解 struct 和 class 的区别对于正确使用 Swift 语言进行编程非常重要。在实际开发中,需要根据具体的需求和场景来选择合适的数据类型,以充分发挥它们的优势,提高代码的质量和效率。
|
16天前
|
存储 Swift iOS开发
Swift 类
10月更文挑战第29天
11 0
|
6月前
Swift4.0判断本函数是否在其它类有相同的方法
Swift4.0判断本函数是否在其它类有相同的方法
43 0
|
6月前
|
安全 Swift 开发者
【Swift开发专栏】Swift类的继承与多态
【4月更文挑战第30天】Swift中的OOP聚焦于类继承与多态,提供代码复用和类型安全。继承通过`class`和冒号实现,子类继承父类属性和方法,支持单继承以降低复杂性。多态借助协议和类型兼容实现,允许统一处理不同类型的对象。继承用于构建复杂类,多态则使代码更通用、可扩展。理解并运用这些概念对Swift开发者至关重要。
56 0
|
6月前
|
存储 数据处理 Swift
在Swift中,类(class)和结构体(struct)
在Swift中,类(class)和结构体(struct)
70 1
|
存储 安全 Swift
29 Swift如何进行类的初始化和反初始化
Swift如何进行类的初始化和反初始化
101 0
|
Swift 图形学 数据安全/隐私保护
Swift 各版本
介绍Swift各个历史版本
325 0
Swift 各版本
|
Swift
swift之图片浏览器
swift之图片浏览器
390 0
swift之图片浏览器
|
存储 Swift
Swift - Cell自适应+代码约束(SnapKit)横竖屏支持平铺+根据URL获取图片size
Swift - Cell自适应+代码约束(SnapKit)横竖屏支持平铺+根据URL获取图片size
220 0