天天看點

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
                    })
                }

            })
        }
    }

}      

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

class func readCacheFromUrl(url:NSString)->NSData?{
        var data:NSData?
        var path:NSString=ZYHWebImageChcheCenter.getFullCachePathFromUrl(url)
        if NSFileManager.defaultManager().fileExistsAtPath(path) {
            data=NSData.dataWithContentsOfMappedFile(path) as? NSData
        }
        return data
    }

    class func writeCacheToUrl(url:NSString, data:NSData){
        var path:NSString=ZYHWebImageChcheCenter.getFullCachePathFromUrl(url)
       println(data.writeToFile(path, atomically: true))
    }
    //設定緩存路徑
    class func getFullCachePathFromUrl(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
    }

    class func stringToZYHString(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

    }