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

简介:

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

一、引言

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

关于watchOS中的缓存框架,在这里:http://my.oschina.net/u/2340880/blog/519023   

二、存储的命名规则

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//这是一个规范缓存命名的方法
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
}

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//进行存取缓存的操作
//取出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)
                     }
                 }
             })

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

目录
相关文章
|
14天前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
1月前
|
缓存 Java
Java本地高性能缓存实践问题之Caffeine缓存库中基于时间设置驱逐策略的问题如何解决
Java本地高性能缓存实践问题之Caffeine缓存库中基于时间设置驱逐策略的问题如何解决
|
3天前
|
机器学习/深度学习 缓存 NoSQL
深度学习在图像识别中的应用与挑战后端开发中的数据缓存策略
本文深入探讨了深度学习技术在图像识别领域的应用,包括卷积神经网络(CNN)的原理、常见模型如ResNet和VGG的介绍,以及这些模型在实际应用中的表现。同时,文章也讨论了数据增强、模型集成等改进性能的方法,并指出了当前面临的计算资源需求高、数据隐私等挑战。通过综合分析,本文旨在为深度学习在图像识别中的进一步研究和应用提供参考。 本文探讨了后端开发中数据缓存的重要性和实现方法,通过具体案例解析Redis在实际应用中的使用。首先介绍了缓存的基本概念及其在后端系统性能优化中的作用;接着详细讲解了Redis的常见数据类型和应用场景;最后通过一个实际项目展示了如何在Django框架中集成Redis,
|
15天前
|
缓存 JavaScript 中间件
优化Express.js应用程序性能:缓存策略、请求压缩和路由匹配
在开发Express.js应用时,采用合理的缓存策略、请求压缩及优化路由匹配可大幅提升性能。本文介绍如何利用`express.static`实现缓存、`compression`中间件压缩响应数据,并通过精确匹配、模块化路由及参数化路由提高路由处理效率,从而打造高效应用。
50 5
|
25天前
|
缓存 NoSQL Java
揭秘性能提升的超级武器:掌握Hibernate二级缓存策略!
【9月更文挑战第3天】在软件开发中,性能优化至关重要。使用Hibernate进行数据持久化的应用可通过二级缓存提升数据访问速度。一级缓存随Session生命周期变化,而二级缓存是SessionFactory级别的全局缓存,能显著减少数据库访问次数,提高性能。要启用二级缓存,需在映射文件或实体类上添加相应配置。然而,并非所有场景都适合使用二级缓存,需根据业务需求和数据变更频率决定。此外,还可与EhCache、Redis等第三方缓存集成,进一步增强缓存效果。合理运用二级缓存策略,有助于大幅提升应用性能。
46 5
|
25天前
|
存储 缓存 前端开发
缓存技术在软件开发中的应用与优化策略
缓存技术在软件开发中的应用与优化策略
|
1月前
|
存储 缓存 监控
系统设计:在搜索系统实现缓存的策略与思考
【8月更文挑战第26天】在构建高性能的搜索系统时,缓存策略是优化查询响应时间和减轻后端数据库压力的关键手段。随着数据量的激增和用户查询需求的多样化,如何设计并实现一套高效、可扩展且易于维护的缓存机制,成为了技术团队面临的重要挑战。本文将深入探讨搜索系统中缓存策略的设计思路与实践经验,旨在为读者提供一套系统性的解决方案。
39 1
|
1月前
|
缓存 算法 前端开发
深入理解缓存淘汰策略:LRU和LFU算法的解析与应用
【8月更文挑战第25天】在计算机科学领域,高效管理资源对于提升系统性能至关重要。内存缓存作为一种加速数据读取的有效方法,其管理策略直接影响整体性能。本文重点介绍两种常用的缓存淘汰算法:LRU(最近最少使用)和LFU(最不经常使用)。LRU算法依据数据最近是否被访问来进行淘汰决策;而LFU算法则根据数据的访问频率做出判断。这两种算法各有特点,适用于不同的应用场景。通过深入分析这两种算法的原理、实现方式及适用场景,本文旨在帮助开发者更好地理解缓存管理机制,从而在实际应用中作出更合理的选择,有效提升系统性能和用户体验。
73 1
|
2月前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
|
1月前
|
存储 缓存 NoSQL
微服务复杂查询之缓存策略
微服务复杂查询之缓存策略