`
wonderzl
  • 浏览: 78905 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

iPhone程序中图片延时加载

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

-(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下来一次后就将图片缓存起来,再次显示的时候就不用去下载。
假设有多张图片,用循环存多个路径:
- (void)downloadImage {
	NSString *imagePath;
	for (...)
		imagePath = [GetImage saveImage:imageUrlPath withCache:@""];
}

需要写GetImage类,实现刚才的方法.
GetImage.h文件如下:
#import <Foundation/Foundation.h>


@interface GetImage : NSObject {
	
}
+(NSString *) saveImage:(NSString *)urlpath withCache:(NSString *)filename;

@end


GetImage.m文件如下:
@implementation GetImage
+(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]

分享到:
评论
1 楼 纳木那咔 2012-01-09  
为啥没有显示出来

相关推荐

Global site tag (gtag.js) - Google Analytics