关于ios异步加载图片的几个开源项目
一、HjCache
原文:http://www.markj.net/hjcache-iphone-image-cache/
获取 HJCache:
HJCache is up on github here: https://github.com/markofjohnson/HJCache
HjCache 是iOS上的一个开源的库,用于异步加载网络图片并在滚动中的tables中显示,同时还支持将图片缓存在本地。HjCache有如下的特性:
1、本地缓存让程序在下次使用时,能够快速地显示。
2、可以自定缓存的大小。
3、缓存中的图片在app中的任意地方都可以使用。
4、当下载被中断时,未完成的图片的缓存并不会被打乱。
5、当界面在跳转时,允许未完成下载的图片继续下载,并完成缓存。
6、必要时,能够对所要用到的图片进行预加载。
上面只是HJCache 的所有特性中的以下部分,HJCache可以做的还有很多
HJCache在设计时想要达到的目的是:
1、让异步加载变得容易。
2、能够轻松地使用本地缓存。
3、在Cocoa体系中,让内存管理变得轻松。
4、支持典型的浏览图片的方式。
5、让library能够应对更多的数据类型,不单单之时图片资源。
如何使用HJCache:
首先在程序初始化的时候创建一个HJObjManager类的实例,如果需要用到本地缓存,则还需要一个HJMOFileCache类的实例:
objMan = [[HJObjManager alloc] init];
//if you are using for full screen images, you'll need a smaller memory cache:
//objMan = [[HJObjManager alloc] initWithLoadingBufferSize:2 memCacheSize:2]];
NSString* cacheDirectory = [NSHomeDirectory() stringByAppendingString:@"/Library/Caches/imgcache/flickr/"] ;
HJMOFileCache* fileCache = [[[HJMOFileCache alloc] initWithRootPath:cacheDirectory] autorelease];
objMan.fileCache = fileCache;
HJManagedImageV 是UIView的子类,用于显示托管于Managed的Images(从URL异步加载、本地缓存中的或其他地方的image)。我们能在任何地方像使用UIImageVIew那样使用HJManagedImageV,在IB也是如此。
下面例子显示如何显示被托管的images,我们设置其URl,然后托管给Manager:
managedImage.url = imageUrlForCurrentRow;
[self.objectManager manage:managedImage];
//NB, the library wants to be used from the main thread, so if you're not in the main thread, use:
//[self.objectManager performSelectorOnMainThread:@selector(manage:) withObject:managedImage waitUntilDone:YES];
这就是我们要做的全部,Manager会track 那些使用了被托管的UImages的views,我们能像普通
UIVIew那样对被托管了的images进行内存管理,当images不再在屏幕中显示时,manager会自动进行处理,或者清理内存或在内存中缓存
指定数量的images或者进行本地缓存工作。
需要注意的是:
HJCache真正的使用者是HJManagedImageV,HJimagedImageV在显示images和在于缓存交互的时候
并没有做太多的事情,以为HJObjManager类接管了所有繁重的、单调的工作。如果HJManagedImageV的表现不符合你的要求,那就放开
手脚去继承它、修改它,要知道HJCache不单单只支持image。
里面的Demo只是一个简单的示范,HJChahe能够用更加绚丽的UI中,能够提供更加强大的功能!!
二、EGOImageLoading
EGOImageLoading是用的比较多的一个第三方图片异步加载类,可以在git上找到并下载它,链接如下。另外提一下,广为人知的下拉刷新EGORefreshTableHeaderView也是就是这个人写的。
https://github.com/enormego/EGOImageLoading
(下载后运行demo程序XCode会提示找不到EGOCache.h头文件,可以在这个地方下载
https://github.com/enormego/EGOCache)
使用方法可以参照里面的demo程序,很简单,只要把ImageUrl告诉它,剩下的就什么都不用管了,它会帮你异步加载,还会做缓存处理
// 设置默认占位图
片 myEgoimageView.placeholderImage = [UIImage imageNamed:@"placeholder.png"]; // 告
诉它图片的url地址, done myEgoimageView.imageURL = [NSURLURLWithString:@"
http://www.baidu.com/img/baidu_sylogo1.gif"];
三、SDWebImage
SDWebImage托管在github上。https://github.com/rs/SDWebImage
这个类库提供一个UIImageView类别以支持加载来自网络的远程图片。具有缓存管理、异步下载、同一个URL下载次数控制和优化等特征。
使用示范的代码:
UITableView使用UIImageView+WebCache类(基本应用,UIImageView的一个category)
前提#import导入UIImageView+WebCache.h文件,然后在tableview的cellForRowAtIndexPath:方法下:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
staticNSString *MyIdentifier =
@"
MyIdentifier
";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:MyIdentifier];
if(cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier] autorelease];
}
//
Here we use the new provided setImageWithURL: method to load the web image
[cell.imageView
setImageWithURL:[NSURL URLWithString:
@"
http://www.baidu.com/img/baidu_sylogo1.gif
"]
placeholderImage:[UIImage imageNamed:
@"
placeholder.png
"]];
cell.textLabel.text =
@"
My Text
";
return cell;
}
基本代码:[imageView setImageWithURL:[NSURL URLWithString:@"http://www.baidu.com/img/baidu_sylogo1.gif"]];
使用SDWebImageManager类:可以进行一些异步加载的工作。
SDWebImageManager *manager = [SDWebImageManager sharedManager];
UIImage *cachedImage = [manager imageWithURL:url];
// 将需要缓存的图片加载进来
if(cachedImage) {
// 如果Cache命中,则直接利用缓存的图片进行有关操作
//
Use the cached image immediatly
}
else{
// 如果Cache没有命中,则去下载指定网络位置的图片,并且给出一个委托方法
//
Start an async download
[manager downloadWithURL:url
delegate:self];
}
当然你的类要实现SDWebImageManagerDelegate协议,并且要实现协议的webImageManager:didFinishWithImage:方法。
// 当下载完成后,调用回调方法,使下载的图片显示
- (
void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image {
//
Do something with the downloaded image
}
独立的异步图像下载
可能会单独用到异步图片下载,则一定要用downloaderWithURL:delegate:来建立一个SDWebImageDownloader实例。
downloader = [SDWebImageDownloader downloaderWithURL:url
delegate:self];
这样SDWebImageDownloaderDelegate协议的方法imageDownloader:didFinishWithImage:被调用时下载会立即开始并完成。
独立的异步图像缓存SDImageCache类提供一个创建空缓存的实例,并用方法imageForKey:来寻找当前缓存。
UIImage *myCachedImage = [[SDImageCache sharedImageCache] imageFromKey:myCacheKey];
存储一个图像到缓存是使用方法storeImage: forKey:
[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];
默认情况下,图像将被存储在内存缓存和磁盘缓存中。如果仅仅是想内存缓存中,要使用storeImage:forKey:toDisk:方法的第三个参数带一负值来替代。
关于ios异步加载图片的几个开源项目的更多相关文章
- IOS 异步加载图片
#import <Foundation/Foundation.h> #import "StringUtils.h" @interface ImageManager : ...
- IOS学习之路二十三(EGOImageLoading异步加载图片开源框架使用)
EGOImageLoading 是一个用的比较多的异步加载图片的第三方类库,简化开发过程,我们直接传入图片的url,这个类库就会自动帮我们异步加载和缓存工作:当从网上获取图片时,如果网速慢图片短时间内 ...
- ios UITableView 异步加载图片并防止错位
UITableView 重用 UITableViewCell 并异步加载图片时会出现图片错乱的情况 对错位原因不明白的同学请参考我的另外一篇随笔:http://www.cnblogs.com/lesl ...
- IOS中UITableView异步加载图片的实现
本文转载至 http://blog.csdn.net/enuola/article/details/8639404 最近做一个项目,需要用到UITableView异步加载图片的例子,看到网上有一个E ...
- 多线程异步加载图片async_pictures
异步加载图片 目标:在表格中异步加载网络图片 目的: 模拟 SDWebImage 基本功能实现 理解 SDWebImage 的底层实现机制 SDWebImage 是非常著名的网络图片处理框架,目前国内 ...
- iOS网络加载图片缓存策略之ASIDownloadCache缓存优化
iOS网络加载图片缓存策略之ASIDownloadCache缓存优化 在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...
- 实例演示Android异步加载图片
本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...
- 实例演示Android异步加载图片(转)
本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...
- android listview 异步加载图片并防止错位
网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...
随机推荐
- 【状态压缩 meet in middle】poj3139Balancing the Scale
数组溢出真是可怕的事情 Description You are given a strange scale (see the figure below), and you are wondering ...
- 离线功能对比:service worker和applicationCache
SW 复杂,事件驱动,可以拦截请求,和缓存这些请求的响应数据,实现的效果更加灵活 AppCache 简单易用,声明式的将要缓存的文件清单声明在一个文件中.由于设计上的原因,它存在一些问题,导致难以运用 ...
- 如何用纯 CSS 创作一个均衡器 loader 动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oybWBy 可交互视频教 ...
- css3的border-radius属性使用方法
1.border-radius可以包含两个参数值,第一个水平圆角半径,第二个为垂直半径,并且两个参数值用“/”分开. 2.border-radius:设置一个值为四个角都相同,两个值为左上和右下相同, ...
- (转) iOS程序国际化
IOS程序国际化 本文转自http://www.cnblogs.com/zhidao-chen/archive/2012/07/08/2581977.html 1.1 新建一个Single View ...
- C++中 #ifdef 和#endif的作用
一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是"条件编译".有时,希望当满足某条件时对一组 ...
- 二分查找与 bisect 模块
Python 的列表(list)内部实现是一个数组,也就是一个线性表.在列表中查找元素可以使用 list.index() 方法,其时间复杂度为O(n).对于大数据量,则可以用二分查找进行优化.二分查找 ...
- pep-8要求归纳
代码布局缩进每个缩进级别使用4个空格. 连续行应使用Python的隐式行连接括号,括号和大括号,或使用悬挂缩进 来垂直对齐包装元素.当使用悬挂式缩进时,应考虑以下内容:第一行应该没有任何争论,应该使用 ...
- 【02】[].slice和Array.prototype.slice
[02][].slice和Array.prototype.slice 01,Array是一个构造函数.浏览器内置的特殊对象. 02,Array没有slice方法. 03,Array.prototy ...
- 【03】Chrome提示印象笔记剪藏插件"已停用不支持的扩展程序"怎么办?
[03] Chrome提示印象笔记剪藏插件"已停用不支持的扩展程序"怎么办? 刚好也遇上了这个问题,百度了一下,以下是解决方法,亲测可行: 1.首先把需要安装的第三方插件,后缀.c ...