iPhone程序中图片延时加载

本文介绍了一种在iOS应用中使用多线程进行图片加载和缓存的方法,通过NSOperationQueue来避免UI阻塞,并利用GetImage类实现图片的下载与缓存。

转自:http://wonderzl.iteye.com/blog/696160

从网上加载图片,当网速慢或是图片较大时,你会发现程序可能会失去对用户的响应.这样你可以用多线程: 


Java代码   收藏代码
  1. -(void) buildData {  
  2.     NSOperationQueue *queue = [NSOperationQueue new];  
  3.       
  4.     [queue setMaxConcurrentOperationCount:NSOperationQueueDefaultMaxConcurrentOperationCount];  
  5.       
  6.     NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self   
  7.                                                                             selector:@selector(downloadImage)   
  8.                                                                               object:nil];  
  9.     [queue addOperation:operation];  
  10.     [operation release];  
  11. }  



解决的方法是从网上down下来一次后就将图片缓存起来,再次显示的时候就不用去下载。 
假设有多张图片,用循环存多个路径: 
Java代码   收藏代码
  1. - (void)downloadImage {  
  2.     NSString *imagePath;  
  3.     for (...)  
  4.         imagePath = [GetImage saveImage:imageUrlPath withCache:@""];  
  5. }  

需要写GetImage类,实现刚才的方法. 
GetImage.h文件如下: 
Java代码   收藏代码
  1. #import <Foundation/Foundation.h>  
  2.   
  3.   
  4. @interface GetImage : NSObject {  
  5.       
  6. }  
  7. +(NSString *) saveImage:(NSString *)urlpath withCache:(NSString *)filename;  
  8.   
  9. @end  


GetImage.m文件如下: 
Java代码   收藏代码
  1. @implementation GetImage  
  2. +(NSString *) saveImage:(NSString *)urlpath withCache:(NSString *)filename  
  3. {  
  4.     NSData *retureData=nil;  
  5.     NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];  
  6.     NSFileManager *fileManager = [NSFileManager defaultManager];  
  7.     NSArray *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);  
  8.     NSString *cachePath = [cache objectAtIndex:0] ;   
  9.     filename=[filename stringByAppendingFormat:@"%@",[urlpath lastPathComponent]];  
  10.     NSString *filepath = [cachePath stringByAppendingString:@"/"];            
  11.     filepath=[filepath stringByAppendingString:filename];  
  12.       
  13.     NSLog(@"filepath=%@",filepath);  
  14.     BOOL success;  
  15.     success = [fileManager fileExistsAtPath:filepath];  
  16.     if (success)   
  17.     {  
  18.         return   filepath;  
  19.           
  20.     }  
  21.     else  
  22.     {  
  23.         NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];    
  24.         [request setURL:[NSURL URLWithString:urlpath]];    
  25.         [request setHTTPMethod:@"GET"];    
  26.           
  27.         NSURLResponse *response;  
  28.         NSError *error;  
  29.           
  30.         retureData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];  
  31.           
  32.         if ([fileManager createDirectoryAtPath:cachePath attributes:nil]==NO){  
  33.             ////NSLog(@"fileManager createDirectoryAtPath:cachePath attributes:nil");  
  34.         }  
  35.         if ([retureData writeToFile:filepath atomically:YES]){  
  36.             NSLog(@"save Image Success");  
  37.         }  
  38.         else  
  39.         {  
  40.             NSLog(@"save Image Fail");  
  41.         }  
  42.     }  
  43.       
  44.     if (retureData !=nil && [fileManager fileExistsAtPath:filepath]){  
  45.           
  46.         return   filepath;  
  47.     }  
  48.     [pool release];  
  49.       
  50.     NSLog(@" Image return nil");  
  51.     return nil;  
  52.       
  53.       
  54.       
  55. }  


至此,存储完毕,在用的时候调用刚才存的路径就可以了,可用方法[[UIImage alloc] initWithContentsOfFile:imagePath] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值