1. 程式人生 > >Swift版本的圖片載入類

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: [email protected]
///
/// 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: 
[email protected]
/// /// 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

相關推薦

Swift版本圖片載入

之前使用OC版本的,都是基於AFN而自行封裝的類庫, 現在寫了一個swift版本的,很方便使用,在些開源出來。 首先是圖片下載類: // // HYBImageLoader.swift // OSChinaClient // // Created by 黃儀標 on

JVM(Java SE 11版本載入和介面

本文介紹了Java虛擬機器(Java SE 11版本)載入類和介面。 載入類和介面 載入是指查詢具有特定名稱的類或介面型別的二進位制形式的過程。典型的做法是,查詢事先由Java編譯器從原始碼計算而來二進位制表示,但也可能是通過動態計算。 二進位制形式最終會構造成一個Class物件

Android Handler 非同步訊息處理機制的妙用 建立強大的圖片載入

                最近建立了一個群,方便大家交流,群號:55032675上一篇部落格介紹了Android非同步訊息處理機制,如果你還不瞭解,可以看:Android 非同步訊息處理機制 讓你深入理解 Looper、Handler、Message三者關係 。那篇部落格的最後,提出可以把非同步訊息處理

Android Handler 非同步訊息處理機制三:妙用手法 建立強大的圖片載入

上一篇部落格介紹了Android非同步訊息處理機制,如果你還不瞭解,可以看:Android 非同步訊息處理機制 讓你深入理解 Looper、Handler、Message三者關係 。那篇部落格的最後,提出可以把非同步訊息處理機制不僅僅是在MainActivit

LIFO和FIFO——Handler 非同步訊息處理機制的妙用 建立強大的圖片載入

最近建立了一個群,方便大家交流,群號:55032675 上一篇部落格介紹了Android非同步訊息處理機制,如果你還不瞭解,可以看:Android 非同步訊息處理機制 讓你深入理解 Looper、Handler、Message三者關係 。那篇部落格的最後,提出可以把非同步訊息處理機制不僅

Android Handler(子執行緒Handler)非同步訊息處理機制的妙用(活用訊號量) 建立強大的圖片載入

最近建立了一個群,方便大家交流,群號:55032675 上一篇部落格介紹了Android非同步訊息處理機制,如果你還不瞭解,可以看:Android 非同步訊息處理機制 讓你深入理解 Looper、Handler、Message三者關係 。那篇部落格的最後

Android Handler 非同步訊息處理機制的妙用 建立強大的圖片載入【轉】

上一篇部落格介紹了Android非同步訊息處理機制,如果你還不瞭解,可以看:Android 非同步訊息處理機制 讓你深入理解 Looper、Handler、Message三者關係 。那篇部落格的最後,提出可以把非同步訊息處理機制不僅僅是在MainActiv

HttpUrlConnection+圖片載入+工具+介面回撥+單例+AsyncTask封裝工具

1.MainActivity頁面 package com.example.httpurlconnection; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import andro

HttpClient+圖片載入+工具+介面回撥+AsyncTask封裝到工具

1.MainActivity頁面 package com.example.httpclient; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widg

HttpClient+圖片載入+工具+介面回撥

1.MainActivity頁面 package com.example.httpclient; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import

iOS基礎網路教程-Swift版本: 3.使用UIWebView載入本地的資料

在前面, 我們使用了 UIWebView 載入了網路的資料, 其實 UIWebView不只是可以載入普通的網頁, 還可以載入其他不同的檔案, 比如視訊, 音樂, PDF, Word等等檔案都是可以的, 下面讓我們來看看~~ PS: 例子裡的 PDF, Txt, doc 檔案請自行準備, 裡面的內容隨便, 只

SDWebImage使用——一個可管理遠端圖片載入

SDWebImage使用——一個可管理遠端圖片載入的類庫 SDWebImage託管在github上。https://github.com/rs/SDWebImage 這個類庫提供一個UIImageView類別以支援載入來自網路的遠端圖片。具有快取管理、非同步下載、同一個UR

Universal-Image-Loader圖片非同步載入

這是 一個開源的Android關於下載顯示圖片的工具類,在這個下載包裡面jar檔案,用於我們匯入專案使用,具體使用方法在包裡面也含有。下面是一個例子: 雙擊程式碼複製 1 2 <uses-permissionandroid:name="android.pe

[Swift通天遁地]五、高階擴充套件-(13)圖片資源本地化設定:根據不同的語言環境顯示不同語言版本圖片

本文將演示如何給應用程式中的圖片資源,進行本地化設定。 在專案資料夾【DemoApp】上點選滑鼠右鍵,彈出右鍵選單。 【Add Files to "DemoApp"】-> 匯入圖片檔案 -> 【Add】 當前的圖片為中文,為該圖片新增本地化設定, 點選顯示或隱藏工具面板圖示,顯示右側的面板

swift 不能載入網路圖片

“App TransportSecurity has blocked a cleartext HTTP (http://) resource load since it isinsecure. Temporary exceptions can be configured v

Android-Image-Loader 圖片非同步載入庫的使用超(詳細配置)

       這個圖片非同步載入並快取的類已經被很多開發者所使用,是最常用的幾個開源庫之一,主流的應用,隨便反編譯幾個火的專案,都可以見到它的身影。        可是有的人並不知道如何去使用這庫如何進行配置,網上查到的資訊對於剛接觸的人來說可能太少了,下面我就把我使用

關於android 4.4以上版本從相簿選取圖片載入不了圖片的問題

1.Android4.4以上版本的呼叫程式碼: public static String getPath(final Context context, final Uri uri) { final boolean isKitKat

圖片載入工具

public class BitmapUtil { private static final String TAG = "BtimapUtil"; /** * 根據網址獲得圖片,優先從本地獲取,本地沒有則從網路下載 * @p

swift之非同步載入圖片的tableview

tableview中使用非同步執行緒載入圖片,並且實現下拉重新整理和上拉翻頁功能。 效果如下: 首先,建立工程: stroyboard中增加tableview 如下: 增加RootTableViewController 程式碼如下: // // RootTab

解決Glide在5.0版本能加載出圖片,在6.0版本載入不出圖片問題

解決辦法: //圓形 public static void load(Context context, String url, ImageView iv){ RequestManager