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.workingPropertyString appendString:string];
}
用一个字符串记录标签的内容。
标签结束的时候调用:
在这个函数中进行判断,然后对model进行处理。-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{}
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];
上面的main方法是线程执行的main方法,其中调用主线程传给它的代码块。-(void)main{ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; if (![self isCancelled]) { self.completionHandler(self.appEntriesArr); } [pool release]; }
completionHandler就是下面的代码块。就是说一个线程执行完自己的操作后可以调用主线程的方法,传入主线程要用的东西。void (^ArrayBlock)(NSArray *) completionHandler;
^(NSArray*appList){ dispatch_async(dispatch_get_main_queue(), ^{ [self handleLoadedApps:appList]; }); }