#import <Foundation/Foundation.h>
#import "StringUtils.h" @interface ImageManager : NSObject
{
NSMutableDictionary *_imageDict;
NSMutableArray *_imageArr;
} @property(nonatomic, strong) NSString *httpUrl;
@property(nonatomic, strong) NSMutableDictionary *imageDict; @property(nonatomic, assign) dispatch_queue_t networkQueue; + (ImageManager *) sharedInstance; - (void)asyncImage:(NSString *)imageName imageView:(UIImageView *)imageView;
//插队
- (void)asyncImageInsert:(NSString *)imageName imageView:(UIImageView *)imageView insert:(BOOL)insert;
//不要在下载之前的数据
- (void)asyncImageCleanOld:(NSString *)imageName imageView:(UIImageView *)imageView cleanOld:(BOOL)cleanOld; @end

实现文件

//
// ImageManager.m
// myb-ios
//
// Created by warrior gao on 13-6-5.
// Copyright (c) 2013年 51myb. All rights reserved.
// #import "ImageManager.h" @interface ImageManager() @end @implementation ImageManager //缓存图片的最大数量
static int counter = ; @synthesize imageDict = _imageDict; //Singleton
+ (ImageManager *)sharedInstance
{
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = self.new;
});
return instance;
} - (id)init
{
if((self = [super init]))
{
self.networkQueue = dispatch_queue_create("com.warrior.network.image", nil);
_imageDict = [[NSMutableDictionary alloc] init];
_imageArr = [[NSMutableArray alloc] init];
}
return self;
} - (NSString *) fileFullPath:(NSString *)fileName
{
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:]; NSString *fileFullPath = [NSString stringWithFormat:@"%@/%@",cachePath,fileName]; return fileFullPath;
} //不要在下载之前的数据
- (void)asyncImageCleanOld:(NSString *)imageName imageView:(UIImageView *)imageView cleanOld:(BOOL)cleanOld
{
if(cleanOld)
{
[_imageArr removeAllObjects];
} [self asyncImage:imageName imageView:imageView];
} //插队,优先
- (void)asyncImageInsert:(NSString *)imageName imageView:(UIImageView *)imageView insert:(BOOL)insert
{
if([StringUtils isEmpty:imageName]){
return;
} NSData *data = [NSData dataWithContentsOfFile:[self fileFullPath:[imageName stringByReplacingOccurrencesOfString:@"/" withString:@"-"]]];
if(data == nil){
[_imageDict setValue:imageView forKey:imageName];
if(insert)
{
[_imageArr insertObject:imageName atIndex:];
}
else
{
[_imageArr addObject:imageName];
} [self cacheImage];
} else {
[imageView setImage:[UIImage imageWithData:data]];
}
} //正常,附加到后面
- (void)asyncImage:(NSString *)imageName imageView:(UIImageView *)imageView
{
[self asyncImageInsert:imageName imageView:imageView insert:NO];
} //异步缓存图片到本地,最多有两个线程
-(void)cacheImage
{
for (; counter < && _imageArr.count > ; counter++)
{
NSString *imageName = nil;
@synchronized(self){
imageName = [[_imageArr objectAtIndex:] copy];
[_imageArr removeObjectAtIndex:];
} if(imageName == nil) continue; dispatch_async(self.networkQueue, ^{ NSLog(@"Starting: %@", imageName);
UIImage *avatarImage = nil;
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",self.httpUrl, imageName]];
NSData *responseData = [NSData dataWithContentsOfURL:url];
if(responseData.length > )
{
[responseData writeToFile:[self fileFullPath:[imageName stringByReplacingOccurrencesOfString:@"/" withString:@"-"]] atomically:NO];
avatarImage = [UIImage imageWithData:responseData];
NSLog(@"Finishing: %@", imageName); if (avatarImage) {
dispatch_async(dispatch_get_main_queue(), ^{
UIImageView *imageView = [_imageDict objectForKey:imageName];
if(imageView != nil && avatarImage != nil){
[imageView setImage:avatarImage];
} [_imageDict removeObjectForKey:imageName];
[imageName release];
});
}
}
counter--;
[self cacheImage];
}); }
} @end

问题,因为对imageView和图片管理器耦合在一起,非常难用。等一下我将放出重构后的代码。

IOS 异步加载图片的更多相关文章

  1. 关于ios异步加载图片的几个开源项目

    一.HjCache  原文:http://www.markj.net/hjcache-iphone-image-cache/ 获取 HJCache: HJCache is up on github h ...

  2. IOS学习之路二十三(EGOImageLoading异步加载图片开源框架使用)

    EGOImageLoading 是一个用的比较多的异步加载图片的第三方类库,简化开发过程,我们直接传入图片的url,这个类库就会自动帮我们异步加载和缓存工作:当从网上获取图片时,如果网速慢图片短时间内 ...

  3. ios UITableView 异步加载图片并防止错位

    UITableView 重用 UITableViewCell 并异步加载图片时会出现图片错乱的情况 对错位原因不明白的同学请参考我的另外一篇随笔:http://www.cnblogs.com/lesl ...

  4. IOS中UITableView异步加载图片的实现

    本文转载至 http://blog.csdn.net/enuola/article/details/8639404  最近做一个项目,需要用到UITableView异步加载图片的例子,看到网上有一个E ...

  5. 多线程异步加载图片async_pictures

    异步加载图片 目标:在表格中异步加载网络图片 目的: 模拟 SDWebImage 基本功能实现 理解 SDWebImage 的底层实现机制 SDWebImage 是非常著名的网络图片处理框架,目前国内 ...

  6. iOS网络加载图片缓存策略之ASIDownloadCache缓存优化

    iOS网络加载图片缓存策略之ASIDownloadCache缓存优化   在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...

  7. 实例演示Android异步加载图片

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  8. 实例演示Android异步加载图片(转)

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  9. android listview 异步加载图片并防止错位

    网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...

随机推荐

  1. DOJO 八 event dojo/on

    官网教程:Events with Dojo在元素上绑定events,需要引用包dojo/on,通过on方法来实现. <button id="myButton">Clic ...

  2. MySQL:创建、修改和删除表

    其实对很多人来说对于SQL语句已经忘了很多,或者说是不懂很多,因为有数据库图形操作软件,方便了大家,但是我们不能忘记最根本的东西,特别是一些细节上的东西,可能你用惯了Hibernate,不用写SQL语 ...

  3. SQL分组查询group by

    注意:select 后的字段,必须要么包含在group by中,要么包含在having 后的聚合函数里. 1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用 group ...

  4. MVC用户登陆验证及权限检查(Form认证)

    1.配置Web.conf,使用Form认证方式   <system.web>     <authentication mode="None" />      ...

  5. 细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4

    1. Unicode与ISO 10646 全世界很多个国家都在为自己的文字编码,并且互不想通,不同的语言字符编码值相同却代表不同的符号(例如:韩文编码EUC-KR中“한국어”的编码值正好是汉字编码GB ...

  6. WCF中配置文件解析

    WCF中配置文件解析[1] 2014-06-14 WCF中配置文件解析 参考 WCF中配置文件解析 返回 在WCF Service Configuration Editor的使用中,我们通过配置工具自 ...

  7. cdoj 1324 卿学姐与公主 线段树裸题

    卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...

  8. UVa 10474 Where is the Marble

    题意:给出一列数,先排序,再查找学习了sort函数,lower_bound函数sort:可以给任意对象排序(包括自己定义的)(前提是定义好了‘<’运算符)lower_bound:查找大于或者等于 ...

  9. ECSHOP 商品评论条件修改——购买过该商品且只能评价一次(购买多少次能评价多少次)

    下文转自http://bbs.ecshop.com/thread-1131529-1-1.html ECSHOP 商品评论条件修改,修改为购买过该商品多少次,就只能评价多少次.不需要修改数据库,原理简 ...

  10. ubuntu下安装Matlab

    (注:本文部分内容转自互联网) 一. 安装程序Step 1:下载matlab的安装文件至主目录下,讲matlab文件重命名为Mathworks.Matlab.R2012a.Unix.isoStep 2 ...