更快地从XML Feed中获取图像的方法

时间:2012-03-30 14:33:37

标签: ios uitableview uiimage nsxmlparser nsscanner

我通过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或其他东西?

2 个答案:

答案 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/

这是我经过数小时搜索后见过的最简单,最优雅的。