博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
watchOS中进行异步图片加载和缓存的策略
阅读量:6478 次
发布时间:2019-06-23

本文共 2967 字,大约阅读时间需要 9 分钟。

hot3.png

watchOS中进行异步图片加载和缓存的策略

一、引言

        iWatch是智能手表的一次革命。iWatch的应用也将会越来越多,基于watch的一些特点,watchOS的开发者需要更加精益的把握watch的UI和性能。运用watchOS自带的缓存体系进行数据的缓存,是增强用户体验度的一种方式,这篇博客,介绍在watchOS中进行异步加载图片和缓存的方法,愿与志同道合的朋友,一起交流。

关于watchOS中的缓存框架,在这里:。

二、存储的命名规则

        在进行设计之前,我们应该先了解,watchOS的缓存容量为最大20M,因为有限,我们更应该认真的利用每一份空间,因此,缓存我们不仅可以存,在即将装满的时候,我们还要有办法从缓存中删去一些东西,让出空间,那么应该删除哪些东西了,我们应该都可以想到,当然是旧的了,把最早的缓存删掉,所以,在存的时候,我们要设计一种规则,可以保存存入的时间,并且不影响我寻找这个缓存文件。我的方法是通过格式化的命名:

//这是一个规范缓存命名的方法func checkString(str:NSString)->NSString{    let result:NSMutableString=NSMutableString()    //先将所有的非字母和数字剔除掉    for var i=0 ; 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}

通过?符号将名称和时间戳进行了拼接。

二、进行异步加载图片和缓存

        这一步是如下的设计思路:通过图片url从缓存的路径中进行寻找,如果有,直接取出图片,如果没有,开启一个线程进行异步加载,完成后刷新主线程UI并将图片文件规范命名后进行缓存:

//进行存取缓存的操作//取出watchOS的缓存目录let imagedic:NSDictionary = WKInterfaceDevice().cachedImages as NSDictionary    //取图片存储的名称    let imageUrl:NSMutableString=NSMutableString()        //这里的url是外界传进来的图片地址url,进行去掉特殊字符        for var i=0 ; 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
 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
< temp?.doubleValue {                                //找到更早的缓存                                temp = str[1] as? NSString                                result = imagedic.allKeys[i] as! String                            }                        }                        //删掉缓存                        WKInterfaceDevice().removeCachedImageWithName(result as! String)                    }                }            })

上面的代码和注释,已经介绍了所有的思路,有错误之处或者更好的方式,还望多多指点。

专注技术,热爱生活,交流技术,也做朋友。

——珲少 QQ群:203317592

转载于:https://my.oschina.net/u/2340880/blog/521527

你可能感兴趣的文章
css布局 - 九宫格布局的方法汇总(更新中...)
查看>>
画图函数——点,线,矩形等等
查看>>
ejabberd_local
查看>>
BZOJ5020 [THUWC 2017]在美妙的数学王国中畅游LCT
查看>>
hdu 6030 矩阵快速幂
查看>>
tomcat类加载机制
查看>>
ado.net2.0中的缓存使用SqlDependency类
查看>>
Java基础学习总结(94)——Java线程再学习
查看>>
iOS开发之调用系统设置
查看>>
利用 ACPI\\ACPI0003设备 判断笔记本还是台式机
查看>>
解决wampserver 服务无法启动
查看>>
ES6中Promise封装ajax的写法
查看>>
初次使用 VUX
查看>>
javascript 字符串转数字的简便写法
查看>>
html之div始终停留在屏幕中间部分
查看>>
Spring中jdbcTemplate的用户实例
查看>>
[模板] 快速傅里叶变换/FFT/NTT
查看>>
DecimalFormat 数据格式设置 SimpleDateFormat时间格式的用法介绍 --转载
查看>>
Android 的Margin和Padding属性以及支持的长度单位
查看>>
HDU ACM 1050 Moving Tables
查看>>