1. 程式人生 > >iOS開發swift版非同步載入網路圖片(帶快取和預設圖片)

iOS開發swift版非同步載入網路圖片(帶快取和預設圖片)

iOS開發之swift版非同步載入網路圖片

    與SDWebImage非同步載入網路圖片的功能相似,只是程式碼比較簡單,功能沒有SD的完善與強大,支援預設新增圖片,支援本地快取。

     非同步載入圖片的核心程式碼如下:

 func setZYHWebImage(url:NSString?, defaultImage:NSString?, isCache:Bool){
        var ZYHImage:UIImage?
        if url == nil {
            return
        }
        //設定預設圖片
        if defaultImage != nil
 {             self.image=UIImage(named: defaultImage!)         }         //是否進行快取處理         if isCache {         //快取管理類             var data:NSData?=ZYHWebImageChcheCenter.readCacheFromUrl(url!)             if data != nil {                 ZYHImage=UIImage(data: data!)                 self.image=ZYHImage             }else
{             //獲取非同步執行緒                var dispath=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)                 dispatch_async(dispath, { () -> Void in                     var URL:NSURL = NSURL(string: url!)!                     var data:NSData?=NSData(contentsOfURL: URL)                     if
 data != nil {                         ZYHImage=UIImage(data: data!)                         //寫快取                         ZYHWebImageChcheCenter.writeCacheToUrl(url!, data: data!)                         //主執行緒中重新整理UI                         dispatch_async(dispatch_get_main_queue(), { () -> Void in                             //重新整理主UI                             self.image=ZYHImage                         })                     }                                      })             }         }else{             var dispath=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)             dispatch_async(dispath, { () -> Void in                 var URL:NSURL = NSURL(string: url!)!                 var data:NSData?=NSData(contentsOfURL: URL)                 if data != nil {                     ZYHImage=UIImage(data: data!)                     //寫快取                     dispatch_async(dispatch_get_main_queue(), { () -> Void in                         //重新整理主UI                         self.image=ZYHImage                     })                 }                              })         }     }      }

快取的處理這裡採用的是寫檔案的方式,通過檔名來對快取進行管理,這個框架還不完善,後面會加入快取清除等功能。快取的核心程式碼如下:

classfuncreadCacheFromUrl(url:NSString)->NSData?{
        var data:NSData?
        var path:NSString=ZYHWebImageChcheCenter.getFullCachePathFromUrl(url)
        if NSFileManager.defaultManager().fileExistsAtPath(path) {
            data=NSData.dataWithContentsOfMappedFile(path) asNSData
        }
        return data
    }
    
    classfuncwriteCacheToUrl(url:NSStringdata:NSData){
        var path:NSString=ZYHWebImageChcheCenter.getFullCachePathFromUrl(url)
       println(data.writeToFile(path, atomically: true))
    }
    //設定快取路徑
    classfuncgetFullCachePathFromUrl(url:NSString)->NSString{
        var chchePath=NSHomeDirectory().stringByAppendingString("/Library/Caches/MyCache")
        var fileManager:NSFileManager=NSFileManager.defaultManager()
        fileManager.fileExistsAtPath(chchePath)
        if !(fileManager.fileExistsAtPath(chchePath)) {
            fileManager.createDirectoryAtPath(chchePath, withIntermediateDirectories: true, attributes: nil, error: nil)
        }
        //進行字串處理
        var newURL:NSString
        newURL=ZYHWebImageChcheCenter.stringToZYHString(url)
        chchePath=chchePath.stringByAppendingFormat("/%@", newURL)
        return chchePath
    }
    
    classfuncstringToZYHString(str:NSString)->NSString{
        var newStr:NSMutableString=NSMutableString()
        for var i:NSInteger=0; i < str.length; i++ {
            var c:unichar=str.characterAtIndex(i)
            if (c>=48&&c<=57)||(c>=65&&c<=90)||(c>=97&&c<=122){
                newStr.appendFormat("%c"c)
            }
        }
        return newStr.copy() as NSString
        
    }

因xcode的版本不同,swift語言語法隨環境時常會變化,此版本在6.1中可用,更高版本中需要修改少部分即可。