当前位置:首页 » 文件管理 » ios开发缓存

ios开发缓存

发布时间: 2025-01-22 02:14:19

‘壹’ iOS本地缓存方案之YYCache源码解析

简单列举一下,iOS的本地缓存方案有挺多,各有各的适用场景:

本文主要聊聊YYCache的优秀设计。高性能的线程安全方案是YYCache比较核心的一个设计目标,很多代码逻辑都是围绕性能这个点来做的。与TMMemoryCache方案相比,YYCache在同步接口的设计上采用了自旋锁来保证线程安全,但仍然在当前线程去执行读操作,这样就可以节省线程切换带来的开销。而TMCache在同步接口里面通过信号量来阻塞当前线程,然后切换到其他线程去执行读取操作,主要的性能损耗在这个线程切换操作上,同步接口没必要去切换线程执行。此外,使用dispatch_sync实现同步的方案也可以做到节省线程切换的开销,与加锁串行的方案相比,性能如何还需要进一步测试验证。除了高性能的本地存储方案,YYCache在本地持久化提高性能方面采取了策略,对于大于20k的数据采取直接存储文件,然后在sqlite中存元信息;对于小于20k的数据则直接存储在sqlite中。数据完整性保障方面,YYCache在存储文件时,存在数据库的元信息和实际文件的存储必须保障原子性。此外,YYCache还新增了实用功能,比如LRU算法,基于存储时长、数量、大小的缓存控制策略等。这些设计和功能使得YYCache在iOS本地缓存方案中具有较高的竞争力和实用性。

‘贰’ ios开发中怎么释放imagenamed这个方法带来的内存缓存

这个类库提供一个UIImageView类别以支持加载来自网络的远程图片。具有缓存管理、异步下载、同一个URL下载次数控制和优化等特征。使用示范的代码:UITableView使用UIImageView+WebCache类(基本应用,UIImageView的一个category)前提#import导入UIImageView+WebCache.h文件,然后在tableview的cellForRowAtIndexPath:方法下:-(UITableViewCell*)tableView:(UITableView*):(NSIndexPath*)indexPath{staticNSString*MyIdentifier=@"MyIdentifier";UITableViewCell*cell=[:MyIdentifier];if(cell==nil){cell=[[UITableViewCellalloc]initWithStyle::MyIdentifier]autorelease];}//:methodtoloadthewebimage[cell.imageViewsetImageWithURL:[NSURLURLWithString:@"/path/to/image.jpg"]placeholderImage:[UIImageimageNamed:@"placeholder.png"];cell.textLabel.text=@"MyText";returncell;}基本代码:[imageViewsetImageWithURL:[NSURLURLWithString:@"/path/image.jpg"];使用SDWebImageManager类:可以进行一些异步加载的工作。SDWebImageManager*manager=[];UIImage*cachedImage=[managerimageWithURL:url];//将需要缓存的图片加载进来if(cachedImage){//如果Cache命中,则直接利用缓存的图片进行有关操作//Usethecachedimageimmediatly}else{//如果Cache没有命中,则去下载指定网络位置的图片,并且给出一个委托方法//Startanasyncdownload[managerdownloadWithURL:urldelegate:self];}当然你的类要实现SDWebImageManagerDelegate协议,并且要实现协议的webImageManager:didFinishWithImage:方法。//当下载完成后,调用回调方法,使下载的图片显示-(void)webImageManager:(SDWebImageManager*):(UIImage*)image{//}独立的异步图像下载可能会单独用到异步图片下载,则一定要用downloaderWithURL:delegate:来建立一个SDWebImageDownloader实例。downloader=[:urldelegate:self];这样SDWebImageDownloaderDelegate协议的方法imageDownloader:didFinishWithImage:被调用时下载会立即开始并完成。独立的异步图像缓存SDImageCache类提供一个创建空缓存的实例,并用方法imageForKey:来寻找当前缓存。UIImage*myCachedImage=[SDImageCachesharedImageCache]imageFromKey:myCacheKey];存储一个图像到缓存是使用方法storeImage:forKey:[SDImageCachesharedImageCache]storeImage:myImageforKey:myCacheKey];默认情况下,图像将被存储在内存缓存和磁盘缓存中。如果仅仅是想内存缓存中,要使用storeImage:forKey:toDisk:方法的第三个参数带一负值来替代。SDWebImage支持异步的图片下载+缓存,提供了UIImageView+WebCacha的category,方便使用。纪录一下SDWebImage加载图片的流程。入口setImageWithURL:placeholderImage:options:会先把placeholderImage显示,然后SDWebImageManager根据URL开始处理图片。进入SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给SDImageCache从缓存查找图片是否已经下载queryDiskCacheForKey:delegate:userInfo:.先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate回调imageCache:didFindImage:forKey:userInfo:到SDWebImageManager。SDWebImageManagerDelegate回调webImageManager:didFinishWithImage:到UIImageView+WebCache等前端展示图片。如果内存缓存中没有,生成NSInvocationOperation添加到队列开始从硬盘查找图片是否已经缓存。根据URLKey在硬盘缓存目录下尝试读取图片文件。这一步是在NSOperation进行的操作,所以回主线程进行结果回调notifyDelegate:。如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate回调imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调imageCache:didNotFindImageForKey:userInfo:。共享或重新生成一个下载器SDWebImageDownloader开始下载图片。图片下载由NSURLConnection来做,实现相关delegate来判断图片下载中、下载完成和下载失败。connection:didReceiveData:中利用ImageIO做了按图片下载进度加载效果。connectionDidFinishLoading:数据下载完成后交给SDWebImageDecoder做图片解码处理。图片解码处理在一个NSOperationQueue完成,不会拖慢主线程UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。在主线程:宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo:回调给SDWebImageDownloader。imageDownloader:didFinishWithImage:回调给SDWebImageManager告知图片下载完成。通知所有的downloadDelegates下载完成,回调给需要的地方展示图片。将图片保存到SDImageCache中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独NSInvocationOperation完成,避免拖慢主线程。SDImageCache在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。SDWI也提供了UIButton+WebCache和MKAnnotationView+WebCache,方便使用。SDWebImagePrefetcher可以预先下载图片,方便后续使用。SDWebImage库的作用:通过对UIImageView的类别扩展来实现异步加载替换图片的工作。

热点内容
苹果手机为什么一直要重设密码 发布:2025-01-22 10:31:26 浏览:983
安卓如何连接路虎car 发布:2025-01-22 10:29:58 浏览:649
javaandroid开发 发布:2025-01-22 10:26:55 浏览:855
如何防止服务器被流量攻击 发布:2025-01-22 10:22:30 浏览:683
动漫生成源码 发布:2025-01-22 10:07:22 浏览:717
手机百度网盘怎么解压文件 发布:2025-01-22 10:05:51 浏览:819
iphone相册文件夹 发布:2025-01-22 10:05:48 浏览:648
安卓手机如何登录两个抖音账号 发布:2025-01-22 10:05:06 浏览:33
如何精通编程 发布:2025-01-22 10:03:37 浏览:780
安卓手机新的二手怎么分 发布:2025-01-22 10:03:32 浏览:52