#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. Hibernate 异常 —— Unable to instantiate default tuplize

    出现这个异常 —— Unable to instantiate default tuplizer ,是 Hibernate 的映射文件(*.hbm.xml)导致的.仔细检查一下工程里的映射文件吧. 笔 ...

  2. The GPG keys listed not correct

    The GPG keys listed for the "Extra Packages for Enterprise Linux 5 - x86_64" repository ar ...

  3. 4.cadence原理图,环境设置[原创]

    1.菜单介绍 创建工程,原理图纸 特殊点: 鼠标先点击1,,在选中1后点击2 在Tools菜单下 Annotate:自动编号 back Annotate: 回标 -- DRC规则检测 Create N ...

  4. Commons-Collections

    package com.bjsxt.others.commons; import java.util.ArrayList; import java.util.List; import org.apac ...

  5. php面向对象(一) 初窥

    初窥php面向对象 1.类:类就是属性和方法的集合 是一个抽象的概念比如生活中的“人”,"汽车"2.对象:对象是具体的事物 比如一叫“小强”的人 一辆叫“奥迪a7”的汽车3.类和对 ...

  6. JSON 之 SuperObject(8): 关于乱码的几种情况 - 向 Henri Gourvest 大师报告

    这几天学习 JSON - SuperObject, 非常幸运地得到了其作者 Henri Gourvest 大师的同步指点! (Henri 大师也是 DSPack 和 GDI+ 头文件的作者; 大师是法 ...

  7. 导出excel小结(C#,.NET,Wpf)

    range.NumberFormatLocal = "@";     //设置单元格格式为文本      range.NumberFormatLocal = "@&quo ...

  8. CSS3之创建透明边框三角

    简述 在前面,我们分享过关于三角的实现方式,主要根据border属性来设置,下面我们来实现上.下.左.右各种不同颜色的三角. 简述 实现 效果 源码 实现 效果 源码 <!DOCTYPE htm ...

  9. HDU (线段树 单点更新) I Hate It

    和上一道题没什么变化,只不过把单点增减变成了单点替换,把区间求和变成了区间求最大值. #include <cstdio> #include <algorithm> using ...

  10. UVa 11210 (DFS) Chinese Mahjong

    大白书第一章的例题,当时看起来很吃力,现如今A这道题的话怎么写都无所谓了. 思路很简单,就是枚举胡哪张牌,然后枚举一下将牌,剩下如果能找到4个顺子或者刻子就胡了. 由于粗心,34个字符串初始化写错,各 ...