1

我通过来自 Wordpress 站点的 XML 提要将数据拉入 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 或其他东西?

4

2 回答 2

1

那是因为您正在通过网络下载图像数据本身。您需要卸载它并异步执行。有一个 NSOperationQueue ,您可以在其中排队图像下载以在单独的线程上发生。

这是一个很好的例子:http: //davidgolightly.blogspot.com/2009/02/asynchronous-image-caching-with-iphone.html

于 2012-03-30T14:45:24.693 回答
1

我将 Joel 的答案标记为最佳答案,因为他给了我异步下载图像的想法,但我最终使用的解决方案在这里:

http://howtomakeiphoneapps.com/how-to-asynchronously-add-web-content-to-uitableview-in-ios/1732/

经过数小时的搜索,这是迄今为止我见过的最简单、最优雅的。

于 2012-03-31T02:39:37.943 回答