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 に答える