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

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

目录
相关文章
|
7月前
|
缓存 负载均衡 网络协议
电商API接口性能优化技术揭秘:缓存策略与负载均衡详解
电商API接口性能优化是提升系统稳定性和用户体验的关键。本文聚焦缓存策略与负载均衡两大核心,详解其在电商业务中的实践。缓存策略涵盖本地、分布式及CDN缓存,通过全量或部分缓存设计和一致性维护,减少后端压力;负载均衡则利用反向代理、DNS轮询等技术,结合动态调整与冗余部署,提高吞吐量与可用性。文中引用大型及跨境电商平台案例,展示优化效果,强调持续监控与迭代的重要性,为电商企业提供了切实可行的性能优化路径。
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
缓存 算法 数据挖掘
深入理解缓存更新策略:从LRU到LFU
【10月更文挑战第7天】 在本文中,我们将探讨计算机系统中缓存机制的核心——缓存更新策略。缓存是提高数据检索速度的关键技术之一,无论是在硬件还是软件层面都扮演着重要角色。我们会详细介绍最常用的两种缓存算法:最近最少使用(LRU)和最少使用频率(LFU),并讨论它们的优缺点及适用场景。通过对比分析,旨在帮助读者更好地理解如何选择和实现适合自己需求的缓存策略,从而优化系统性能。
494 3
|
8月前
|
缓存 搜索推荐 CDN
HTTP缓存策略的区别和解决的问题
总的来说,HTTP缓存策略是一种权衡,需要根据具体的应用场景和需求来选择合适的策略。理解和掌握这些策略,可以帮助我们更好地优化网页性能,提高用户的浏览体验。
238 11
|
10月前
|
数据采集 缓存 JavaScript
数据抓取的缓存策略:减少重复请求与资源消耗
本教程聚焦于提升爬虫效率与稳定性,通过结合缓存策略、代理IP技术(如爬虫代理)、Cookie和User-Agent设置,优化数据采集流程。以知乎为例,详细讲解如何抓取指定关键词的文章标题和内容。内容涵盖环境准备、代码实现、常见问题及解决方案,并提供延伸练习,帮助读者掌握高效爬虫技巧。适合具备Python基础的初学者,助你规避网站机制,顺利获取目标数据。
302 2
数据抓取的缓存策略:减少重复请求与资源消耗
|
7月前
|
存储 缓存
.NET 6中Startup.cs文件注入本地缓存策略与服务生命周期管理实践:AddTransient, AddScoped, AddSingleton。
记住,选择正确的服务生命周期并妥善管理它们是至关重要的,因为它们直接影响你的应用程序的性能和行为。就像一个成功的建筑工地,工具箱如果整理得当,工具选择和使用得当,工地的整体效率将会大大提高。
290 0
|
Web App开发 缓存 UED
如何设置浏览器的缓存策略?
【10月更文挑战第23天】通过合理地设置浏览器的缓存策略,可以在提高网页性能、减少网络流量的同时,确保用户能够获取到最新的内容,从而提升用户体验和网站的性能优化效果。
1225 60
|
缓存 API C#
C# 一分钟浅谈:GraphQL 中的缓存策略
本文介绍了在现代 Web 应用中,随着数据复杂度的增加,GraphQL 作为一种更灵活的数据查询语言的重要性,以及如何通过缓存策略优化其性能。文章详细探讨了客户端缓存、网络层缓存和服务器端缓存的实现方法,并提供了 C# 示例代码,帮助开发者理解和应用这些技术。同时,文中还讨论了缓存设计中的常见问题及解决方案,如缓存键设计、缓存失效策略等,旨在提升应用的响应速度和稳定性。
201 13
|
存储 缓存 安全
在 Service Worker 中配置缓存策略
Service Worker 是一种可编程的网络代理,允许开发者控制网页如何加载资源。通过在 Service Worker 中配置缓存策略,可以优化应用性能,减少加载时间,提升用户体验。此策略涉及缓存的存储、更新和检索机制。
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
215 10