异步下载图片小项目中遇到的问题总结

来源:互联网 发布:网络直播平台搭建 编辑:程序博客网 时间:2024/05/01 15:00

1.下载的图片大小和UITableViewCell默认的图片大小不匹配的时候,要对图片大小进行调整,方法如下:

//appImageData是从网上下载的图片的数据,转化为UIImage    UIImage *image = [[UIImage alloc]initWithData:self.appImageData];    //判断如果图片的大小和要求的大小不符合的话执行    if (image.size.width != kAppIconSize ||image.size.height != kAppIconSize) {        //创建期望的大小        CGSize itemSize = CGSizeMake(kAppIconSize, kAppIconSize);        //开始图像上下文,上下文的大小就是期望的大小        UIGraphicsBeginImageContext(itemSize);        //把图片画在期望的大小上        CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);        [image drawInRect:imageRect];        //从上下文中取得上下文的图片,就是想要的图片大小        self.appRecord.appImage = UIGraphicsGetImageFromCurrentImageContext();        //结束上下文        UIGraphicsEndImageContext();    }

2,从xml文件中读取的图片URL地址必须要经过处理才能下载图片,去掉空格和新行字符,方法:

//必须要进行字符串处理,要不然下载不了图片        NSString *str = [workingPropertyString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

3,NSXMLParser用法

当从XML文件中找到一个标签时就调用这个方法,在这个方法中初始化model

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{        if([elementName isEqualToString:kEntryStr]){        self.appEntry = [[[AppRecord alloc]init]autorelease];    }}


当找到标签的内容时调用:

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    [self.workingPropertyStringappendString:string];

}

用一个字符串记录标签的内容。

标签结束的时候调用:

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{}
在这个函数中进行判断,然后对model进行处理。

if ([elementName isEqualToString:kNameStr]) {            self.appEntry.appName = str;        }        else if([elementName isEqualToString:kImageURLStr]){            self.appEntry.appImageURL = str;        }


4.如果model中已经有了图片直接赋值,如果没有,用startDownload方法去网上下载,记住要有个“占位”的图片。

if (!record.appImage) {                    [self startDownloadIcon:record forIndex:indexPath];
 cell.imageView.image = [UIImage imageNamed:@"Placeholder.png"]; } else{ cell.imageView.image = record.appImage; }
5,进行解析大的xml文件的时候要用多线程,要不会有界面假死现象

NSOperationQueue线程池,NSOperation代表一个线程,把一个线程加入线程池中执行:

    queue = [[NSOperationQueue alloc]init];    ParseOperation *parser = [[ParseOperation alloc]init]    [queue addOperation:parser];

-(void)main{    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];    if (![self isCancelled]) {        self.completionHandler(self.appEntriesArr);    }    [pool release];}
上面的main方法是线程执行的main方法,其中调用主线程传给它的代码块。

void (^ArrayBlock)(NSArray *) completionHandler;

completionHandler就是下面的代码块。就是说一个线程执行完自己的操作后可以调用主线程的方法,传入主线程要用的东西。

^(NSArray*appList){        dispatch_async(dispatch_get_main_queue(), ^{            [self handleLoadedApps:appList];         });    }