从网上加载图片,当网速慢或是图片较大时,你会发现程序可能会失去对用户的响应.这样你可以用多线程:
NSOperationQueue *queue = [NSOperationQueue new];
[queue setMaxConcurrentOperationCount:NSOperationQueueDefaultMaxConcurrentOperationCount];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(downloadImage)
object:nil];
[queue addOperation:operation];
[operation release];
}
-(void) buildData { NSOperationQueue *queue = [NSOperationQueue new]; [queue setMaxConcurrentOperationCount:NSOperationQueueDefaultMaxConcurrentOperationCount]; NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage) object:nil]; [queue addOperation:operation]; [operation release]; }
解决的方法是从网上down下来一次后就将图片缓存起来,再次显示的时候就不用去下载。
假设有多张图片,用循环存多个路径:
- NSString *imagePath;
- for (...)
- imagePath = [GetImage saveImage:imageUrlPath withCache:@""];
- }
- (void)downloadImage { NSString *imagePath; for (...) imagePath = [GetImage saveImage:imageUrlPath withCache:@""]; }
需要写GetImage类,实现刚才的方法.
GetImage.h文件如下:
@interface GetImage : NSObject {
}
+(NSString *) saveImage:(NSString *)urlpath withCache:(NSString *)filename;
@end
#import <Foundation/Foundation.h> @interface GetImage : NSObject { } +(NSString *) saveImage:(NSString *)urlpath withCache:(NSString *)filename; @end
GetImage.m文件如下:
+(NSString *) saveImage:(NSString *)urlpath withCache:(NSString *)filename
{
NSData *retureData=nil;
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [cache objectAtIndex:0] ;
filename=[filename stringByAppendingFormat:@"%@",[urlpath lastPathComponent]];
NSString *filepath = [cachePath stringByAppendingString:@"/"];
filepath=[filepath stringByAppendingString:filename];
NSLog(@"filepath=%@",filepath);
BOOL success;
success = [fileManager fileExistsAtPath:filepath];
if (success)
{
return filepath;
}
else
{
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:urlpath]];
[request setHTTPMethod:@"GET"];
NSURLResponse *response;
NSError *error;
retureData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if ([fileManager createDirectoryAtPath:cachePath attributes:nil]==NO){
////NSLog(@"fileManager createDirectoryAtPath:cachePath attributes:nil");
}
if ([retureData writeToFile:filepath atomically:YES]){
NSLog(@"save Image Success");
}
else
{
NSLog(@"save Image Fail");
}
}
if (retureData !=nil && [fileManager fileExistsAtPath:filepath]){
return filepath;
}
[pool release];
NSLog(@" Image return nil");
return nil;
}
至此,存储完毕,在用的时候调用刚才存的路径就可以了,可用方法[[UIImage alloc] initWithContentsOfFile:imagePath]