我通过Wordpress网站的XML Feed将数据拖入UITableView。如果帖子包含一个图像,我想显示带有图像的表格,如果没有,则我想显示默认图像。所以在我的
- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
方法,我有一个if语句,如下所示:
if ([elementname isEqualToString:@"content:encoded"]) {
NSString *firstImageURL = [self getFirstImageUrl:currentStory.content];
currentStory.imageURL = firstImageURL;
UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString: firstImageURL]]];
currentStory.image = image;
}
这会调用getFirstImageURL,如下所示:
-(NSString *)getFirstImageUrl: (NSString *) html {
NSScanner *theScanner;
NSString *imageURL = nil;
theScanner = [NSScanner scannerWithString: html];
// find start of tag
[theScanner scanUpToString: @"<img" intoString: NULL];
if ([theScanner isAtEnd] == NO) {
[theScanner scanUpToString: @"src=\"" intoString: NULL];
NSInteger newLoc2 = [theScanner scanLocation] + 5;
[theScanner setScanLocation: newLoc2];
// find end of tag
[theScanner scanUpToString: @"\"" intoString: &imageURL];
}
return imageURL;
}
一切都按预期工作,但加载表大约需要5到6秒,有时可能需要10秒,这是不可取的。我想知道我能做些什么来加快抓住第一张照片的过程。
更新
因此经过更多调查后,我看到的瓶颈似乎与我下载图片无关。事实上,实际下载图像的时间不会超过2秒。当我下载RSS提要时,看起来就像瓶颈一样:
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
这一直持续时间最长。
2012-03-30 14:35:11.506 gbllc[883:3203] inside grabDataForFeed
2012-03-30 14:35:11.510 gbllc[883:3203] reached loadXMLByURL
2012-03-30 14:35:11.512 gbllc[883:3203] after stories alloc
**** 5 seconds ****
2012-03-30 14:35:16.568 gbllc[883:3203] after initWithContentsOfURL
2012-03-30 14:35:16.570 gbllc[883:3203] after initWithData
2012-03-30 14:35:16.573 gbllc[883:3203] about to parse
*** I now parse the XML and download images, takes 2 seconds ***
2012-03-30 14:35:18.066 gbllc[883:3203] Parsed successfully
在我分配数据对象之后,我抓取数据进行解析。所以我想我的原始问题不再有效,我应该问一下,如果有更快的方法来获取解析的初始数据,或者我是否应该更改模型并尝试使用json或其他东西?
答案 0 :(得分:1)
那是因为您正在通过网络下载图像数据。您需要卸载它并异步执行。有一个NSOperationQueue,您可以将图像下载排队到单独的线程上。
这是一个很好的例子:http://davidgolightly.blogspot.com/2009/02/asynchronous-image-caching-with-iphone.html
答案 1 :(得分:1)
我将Joel的答案标记为最佳答案,因为他向我提出了异步下载图像的想法,但我最终使用的解决方案是:
http://howtomakeiphoneapps.com/how-to-asynchronously-add-web-content-to-uitableview-in-ios/1732/
这是我经过数小时搜索后见过的最简单,最优雅的。