孤海傲月

导航

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];  

}  

 -(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 {  
  1.     NSString *imagePath;  
  2.     for (...)  
  3.         imagePath = [GetImage saveImage:imageUrlPath withCache:@""];  
  4. }  
 - (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  

 #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]

posted on 2012-10-18 11:49  孤海傲月  阅读(364)  评论(0编辑  收藏  举报