IOS 异步加载图片
#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 异步加载图片的更多相关文章
- 关于ios异步加载图片的几个开源项目
一.HjCache 原文:http://www.markj.net/hjcache-iphone-image-cache/ 获取 HJCache: HJCache is up on github h ...
- 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 ...
随机推荐
- poj-2376 Cleaning Shifts (排序+贪心)
http://poj.org/problem?id=2376 john有n头牛做打扫工作,他想在t时间内每个时间都至少有一头牛在做打扫工作,第一头牛在1,最后一头牛在t时间,每一头牛工作都有一个开始时 ...
- poj-1017 Packets (贪心)
http://poj.org/problem?id=1017 工厂生产高度都为h,长和宽分别是1×1 2×2 3×3 4×4 5×5 6×6的6种规格的方形物品,交给顾客的时候需要包装,包装盒长宽高都 ...
- Newtonsoft.Json序列化和反序列之javascriptConvert.SerializeObject,DeserializeObject,JsonWriter,JsonReader
这里下载:http://www.newtonsoft.com/products/json/安装: 1.解压下载文件,得到Newtonsoft.Json.dll 2.在项目中添加引用.. jav ...
- Android 的 ramdisk.img、system.img、userdata.img 作用说明,以及UBoot 系统启动过程
首先通過編譯,先將android內核編譯成功.正常情況下,在目錄out/target.product/generic/(但是有的就沒有generic文件,如freescale和iriver:但是lon ...
- ViewState压缩技术
ViewState 的使用,大家可以说是又爱又恨,它其中一个特性就是保存页面的状态,对于只是展示的页面,我们可以直接在页面文件中使用 EnableViewState="false" ...
- mysql中的去除空格函数
(1)mysql replace 函数 语法:replace(object,search,replace) 意思:把object中出现search的全部替换为replace 案例:update `ne ...
- R语言AMORE包实现BP神经网络——German数据集
library(AMORE)data<-read.table('G:\\dataguru\\ML\\ML09\\基于BP网络的个人信贷信用评估\\基于BP网络的个人信贷信用评估\\german. ...
- 20160203.CCPP体系详解(0013天)
程序片段(01):数组.c+02.数组初始化语法.c 内容概要:数组 ///01.数组.c #include <stdio.h> #include <stdlib.h> //0 ...
- Dataguard常用命令汇总
----标准DataGuard参数设置------------------------------alter system set log_archive_dest_2='SERVICE=ta_std ...
- Android Studio你不知道的调试技巧
写代码不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug:那么你的调试技术停留在哪一阶段呢?仅仅是下个断点单步执行吗?或者你知道 Evaluate Expression, 知道条件断点 ...