watchOS中進行異步圖片加載和緩存的策略

watchOS中進行異步圖片加載和緩存的策略

1、引言

        iWatch是智能手錶的一次革命。iWatch的應用也將會愈來愈多,基於watch的一些特色,watchOS的開發者須要更加精益的把握watch的UI和性能。運用watchOS自帶的緩存體系進行數據的緩存,是加強用戶體驗度的一種方式,這篇博客,介紹在watchOS中進行異步加載圖片和緩存的方法,願與志同道合的朋友,一塊兒交流。緩存

關於watchOS中的緩存框架,在這裏:http://my.oschina.net/u/2340880/blog/519023   app

2、存儲的命名規則

        在進行設計以前,咱們應該先了解,watchOS的緩存容量爲最大20M,由於有限,咱們更應該認真的利用每一份空間,所以,緩存咱們不只能夠存,在即將裝滿的時候,咱們還要有辦法從緩存中刪去一些東西,讓出空間,那麼應該刪除哪些東西了,咱們應該均可以想到,固然是舊的了,把最先的緩存刪掉,因此,在存的時候,咱們要設計一種規則,能夠保存存入的時間,而且不影響我尋找這個緩存文件。個人方法是經過格式化的命名:框架

//這是一個規範緩存命名的方法
func checkString(str:NSString)->NSString{
    let result:NSMutableString=NSMutableString()
    //先將全部的非字母和數字剔除掉
    for var i=0 ; i<str.length ; i++ {
        if (str.characterAtIndex(i)>=48&&str.characterAtIndex(i)<=57)||(str.characterAtIndex(i)>=65&&str.characterAtIndex(i)<=90)||(str.characterAtIndex(i)>=97&&str.characterAtIndex(i)<=122){
            result.appendFormat("%c",str.characterAtIndex(i))
        }
    }
    //拼接上當前時間戳
    let date:Double = NSDate().timeIntervalSince1970
    result.appendFormat("?%.0f",date)
    return result
}

經過?符號將名稱和時間戳進行了拼接。異步

2、進行異步加載圖片和緩存

        這一步是以下的設計思路:經過圖片url從緩存的路徑中進行尋找,若是有,直接取出圖片,若是沒有,開啓一個線程進行異步加載,完成後刷新主線程UI並將圖片文件規範命名後進行緩存:async

//進行存取緩存的操做
//取出watchOS的緩存目錄
let imagedic:NSDictionary = WKInterfaceDevice().cachedImages as NSDictionary
    //取圖片存儲的名稱
    let imageUrl:NSMutableString=NSMutableString()
        //這裏的url是外界傳進來的圖片地址url,進行去掉特殊字符
        for var i=0 ; i<url?.length ; i++ {
            if (url?.characterAtIndex(i)>=48&&url?.characterAtIndex(i)<=57)||(url?.characterAtIndex(i)>=65&&url?.characterAtIndex(i)<=90)||(url?.characterAtIndex(i)>=97&&url?.characterAtIndex(i)<=122){
                imageUrl.appendFormat("%c",(url?.characterAtIndex(i))!)
             }
        }
        //查找緩存中是否有圖片
        //遍歷watchOS的緩存目錄
        for var i=0 ; i<imagedic.allKeys.count ; i++ {
           //經過規定好的?進行分割
           let str:NSArray =  imagedic.allKeys[i].componentsSeparatedByString("?")
                if str[0].isEqualToString(imageUrl as String) {
                    //找到圖片 view是要設置的interfaceImage
                    view.setImageNamed(imagedic.allKeys[i] as? String)
                    return;
                }
            }
            //設置缺省圖片 這裏是外界傳進來的缺省圖片,若是須要下載,先設置缺省圖片
            if defaultImage != nil {
                view.setImageNamed(defaultImage as? String)
            }
            
            //進行下載和存儲
            let dispath = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
            //在新的線程中下載
            dispatch_async(dispath, { () -> Void in
                let imgURL:NSURL = NSURL(string: url as! String)!
                let imageData:NSData? = NSData(contentsOfURL: imgURL)
                if imageData != nil {
                    //主線程中刷新
                    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                        view.setImageData(imageData!)
                    })
                    //寫緩存  若是緩存滿了 就刪掉時間戳最先的一張緩存
                    //這個方法會返回bool值,判斷是否存入成功
                    while !WKInterfaceDevice().addCachedImageWithData(imageData!, name: checkString(url!) as String) {
                        //若是存入失敗,刪去時間戳最先的緩存
                        var temp:NSString?
                        //保存最先的緩存名稱
                        var result:NSString?
                        for var i=0 ; i<imagedic.allKeys.count ; i++ {
                            let str:NSArray =  imagedic.allKeys[i].componentsSeparatedByString("?")
                            if temp == nil {
                                temp = str[1] as? NSString
                                result = imagedic.allKeys[i] as! String
                                break
                            }
                            if str[1].doubleValue < temp?.doubleValue {
                                //找到更早的緩存
                                temp = str[1] as? NSString
                                result = imagedic.allKeys[i] as! String
                            }
                        }
                        //刪掉緩存
                        WKInterfaceDevice().removeCachedImageWithName(result as! String)
                    }
                }
            })

上面的代碼和註釋,已經介紹了全部的思路,有錯誤之處或者更好的方式,還望多多指點。性能

專一技術,熱愛生活,交流技術,也作朋友。url

——琿少 QQ羣:203317592spa

相關文章
相關標籤/搜索