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];
}
用一个字符串记录标签的内容。
标签结束的时候调用:
-(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];
});
}