前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >watchOS中进行异步图片加载和缓存的策略

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

作者头像
珲少
发布于 2018-08-15 10:00:04
发布于 2018-08-15 10:00:04
72700
代码可运行
举报
文章被收录于专栏:一“技”之长一“技”之长
运行总次数:0
代码可运行

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

一、引言

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

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

二、存储的命名规则

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//这是一个规范缓存命名的方法
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并将图片文件规范命名后进行缓存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//进行存取缓存的操作
//取出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)
                    }
                }
            })

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

专注技术,热爱生活,交流技术,也做朋友。 ——珲少 QQ群:203317592

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015/10/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS开发swift版异步加载网络图片(带缓存和缺省图片)
    与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存。
珲少
2018/08/16
1.8K0
WKWebView长按保存图片逻辑
在WKWebView上的图片,长按会触发系统控件进行保存和共享,但通过系统共享是没法分享图片,只能进行长按手势覆盖,然后用本地控件实现
freesan44
2020/05/18
2.9K0
listview异步加载图片并防止错位
android listview 异步加载图片并防止错位 网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 conv
xiangzhihong
2018/02/01
9260
listview异步加载图片并防止错位
算法-DFA算法-敏感词过滤算法(OC、Swift、Python)
前段时间,公司的IM SDK想做敏感词过滤,但是后端的小伙伴《比较忙》,在开产品需求会的时候想把敏感词过滤放到前端,让iOS、安卓自己搞,但是前端小伙伴写了一个方法来检测一段文本,耗时【一两秒】钟而且比较耗CPU,这样肯定不行的,最后后端小伙伴妥协了,把敏感词过滤放到后端了。
用户6004386
2019/10/23
6.5K0
算法-DFA算法-敏感词过滤算法(OC、Swift、Python)
Android实现图片异步加载操作
Android实现图片异步加载操作 在Android开发过程中,为了防止阻塞UI,图片加载时经常采用异步的方法来加载,异步加载图片的主要流程是进行判断缓存中是否存在图片,如果存在则直接返回,如果不存在则进行下载并进行缓存。 以下是建立一个异步下载类: /** * User: Tom * Date: 13-5-13 * Time: 下午8:07 */ public class AsnycImageLoader { //定义一个HashMap进行存放缓存的Image key为String Val
用户1289394
2018/02/26
1.3K0
腾讯云V3签名方法之iOS
签名方法 v3 (TC3-HMAC-SHA256)功能上覆盖了以前的签名方法 v1,而且更安全,支持更大的请求,支持 json 格式,性能有一定提升,推荐使用该签名方法计算签名。
许岳操
2020/08/03
3.4K0
腾讯云V3签名方法之iOS
聊聊怎么阅读SDWebImage源码
关于SDWebImage的介绍就不多说了,网上很多。我们主要聊聊怎么阅读SDWebImage的源码。 阅读源码前首先我们要思考几个问题: 1.SDWebImage的下载流程是怎么样的? 2.SDWebImage怎么处理多线程并发? 3.SDWebImage怎么处理缓存? 4.SDWebImage怎么设置图片? 5.缓存多久?
赵哥窟
2018/09/13
7100
聊聊怎么阅读SDWebImage源码
iOS缓存 NSCache详解及SDWebImage缓存策略源码分析你要知道的NSCache都在这里
你要知道的NSCache都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本篇文章首先会详细讲解NSCache的基本使用,NSCache是Foundation框架提供的缓存类的实现,使用方式类似于可变字典,由于NSMutableDictionary的存在,很多人在实现缓存时都会使用可变字典,但NSCache在实现缓存功能时比可变字典更方便,最重要的是它是线程安全的,而NSMutableDictionary不是线程安全的,在多线程环境下
WWWWDotPNG
2018/04/10
4K1
iOS缓存 NSCache详解及SDWebImage缓存策略源码分析你要知道的NSCache都在这里
OC基础--字符串
做iOS开发有3年了,从当初的小白到现在,断断续续看过很多资料,之前也写过一些博文来记录,但是感觉知识点都比较凌乱。所以最近准备抽时间把iOS开发的相关知识进行一个梳理,主要分为OC基础、UI控件、多线程、动画、网络、数据持久化、自动布局、第三方框架等几个模块进行梳理。本系列的所有博文集合参见:iOS开发知识梳理博文集。本文主要介绍 OC基础--字符串。
mukekeheart
2020/09/07
1K0
实例演示Android异步加载图片
本文给大家演示异步加载图片的分析过程。让大家了解异步加载图片的好处,以及如何更新UI。 首先给出main.xml布局文件: 简单来说就是 LinearLayout 布局,其下放了2个TextView和
欢醉
2018/01/22
1.4K0
[翻译]Bitmap的异步加载和缓存
本文主要介绍了如何在Android开发中实现高效的图片加载和显示。首先介绍了如何通过自定义ImageView和Bitmap类来优化图片加载和显示,然后介绍了如何使用AsyncDrawable和BitmapWorkerTask类来实现异步加载和显示图片,最后给出了一组示例代码和注意事项。
用户1172465
2018/01/08
1.9K0
[iOS源码笔记]·第三方网络图片处理框架:SDWebImage网络下载及缓存管理策略
typedef void(^SDExternalCompletionBlock)(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL);
陈满iOS
2018/09/10
2.3K0
[iOS源码笔记]·第三方网络图片处理框架:SDWebImage网络下载及缓存管理策略
图片加载利器——Picasso
piacsso是Square公司开源的一个Android的图形缓存库 官网地址:http://square.github.io/picasso/ Images add much-needed context and visual flair to Android applications. Picasso allows for hassle-free image loading in your application—often in one line of code! Picasso.with(context).load(“http://i.imgur.com/DvpvklR.png“).into(imageView); Many common pitfalls of image loading on Android are handled automatically by Picasso: Handling ImageView recycling and download cancelation in an adapter. Complex image transformations with minimal memory use. Automatic memory and disk caching. 简单来说 其强大的部分在于,可以实现图片下载和缓存功能,并且完全通过一行代码就能实现图片的异步加载:
Demo_Yang
2018/10/15
6330
IOS开发问题索引(九)
http://blog.csdn.net/lvxiangan/article/details/20939379
江中散人_Jun
2022/03/08
9580
IOS开发问题索引(九)
Android图片加载库:最全面解析Glide用法
前言 上文已经对当今Android主流的图片加载库进行了全面介绍 & 对比 如果你还没阅读,我建议你先移步这里进行查看 今天我们来学习一下其中一个Android主流的图片加载库的使用 - Gl
Carson.Ho
2019/02/22
3.6K0
iOS-Foundation框架中常用的类
Foundation框架中最常用的类。 Foundation框架中最我们经常用的类大致有NSString、NSArray、NSDictionary等等,虽然不需要将每一个类中提供了什么方法都记下来,但是需要做到心中有数,知道Foundation框架提供了什么样的方法,能够达到什么效果,用到的时候直接去API中查找即可,避免因为不知道有这些方法,而走弯路。 NSString NSString创建与内存存储 NSString是1个数据类型,用来保存OC字符串,NSString的本质是1个类,既然是1个类,所以,
xx_Cc
2018/05/10
1.8K0
老司机出品———疯狂造轮子之图片异步下载类
SDWebImage,我估计没有一个做iOS的不知道这个三方库吧,他为我们提供了简洁的图片异步下载方式。在他为我一句api带来这么大便利的同时,你有没有想过他是怎么实现的呢?让我们先来看看他为我们做了什么?
老司机Wicky
2018/08/22
5040
老司机出品———疯狂造轮子之图片异步下载类
SDWebImage 源码阅读(缓存)
在 SDWebImage 中,设计了两种缓存 1.SDMemoryCache:它继承自 NSCache 用来实现内存缓存 2.NSFileManager:使用文件的方式来实现磁盘缓存 先来看一下 SDImageCache 的内存缓存的实现 @interface SDMemoryCache <KeyType, ObjectType> () @property (nonatomic, strong, nonnull) NSMapTable<KeyType, ObjectType> *weakCache;
用户2215591
2018/06/13
1.4K0
Android ListView异步加载图片乱序问题,原因分析及解决方案
用户1158055
2018/01/08
1.8K0
Android ListView异步加载图片乱序问题,原因分析及解决方案
Carson带你学Android:最全面解析图片加载库Glide用法
api也提供了几个常用的动画:比如crossFade() R.anim.item_alpha_in
Carson.Ho
2022/03/24
9220
Carson带你学Android:最全面解析图片加载库Glide用法
相关推荐
iOS开发swift版异步加载网络图片(带缓存和缺省图片)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验