0

RSS フィード経由でデータを取得し、各記事をテーブル ビュー セルに表示しています。各セルには、デフォルトの画像に設定された画像ビューがあります。ページに画像がある場合、画像は記事の画像に置き換えられます。現時点では、各セルが Web ページからソース コードをダウンロードするため、View Controller を押してスクロールしようとすると、アプリの動作が遅くなります。

これが私がcellForRowAtIndexPath:メソッドに持っているものです。

    NSString * storyLink = [[stories objectAtIndex: storyIndex] objectForKey: @"link"];
    storyLink = [storyLink stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSString *sourceCode = [NSString stringWithContentsOfURL:[NSURL URLWithString:storyLink] encoding:NSUTF8StringEncoding error:&error];

    NSString *startPt = @"instant-gallery";
    NSString *startPt2 = @"<img src=\"";

    if ([sourceCode rangeOfString:startPt].length != 0) { //webpage has images
    // find the first  "<img src=...>" tag starting from "instant-gallery"
    NSString *trimmedSource = [sourceCode substringFromIndex:NSMaxRange([sourceCode rangeOfString:startPt])];
    trimmedSource = [trimmedSource substringFromIndex:NSMaxRange([trimmedSource rangeOfString:startPt2])];
    trimmedSource = [trimmedSource substringToIndex:[trimmedSource rangeOfString:@"\""].location];

    NSURL *url = [NSURL URLWithString:trimmedSource];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];
    cell.picture.image = image;

誰かが使用を提案しNSOperationQueueました。この方法は良い解決策でしょうか?

編集:

  dispatch_queue_t someQueue = dispatch_queue_create("cell background queue", NULL);
    dispatch_async(someQueue, ^(void){

        NSError *error = nil;
        NSString * storyLink = [[stories objectAtIndex: storyIndex] objectForKey: @"link"];
        storyLink = [storyLink stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        NSString *sourceCode = [NSString stringWithContentsOfURL:[NSURL URLWithString:storyLink] encoding:NSUTF8StringEncoding error:&error];

        NSString *startPt = @"instant-gallery";
        NSString *startPt2 = @"<img src=\"";

        if ([sourceCode rangeOfString:startPt].length != 0) { //webpage has images
            // find the first  "<img src=...>" tag starting from "instant-gallery"
            NSString *trimmedSource = [sourceCode substringFromIndex:NSMaxRange([sourceCode rangeOfString:startPt])];
            trimmedSource = [trimmedSource substringFromIndex:NSMaxRange([trimmedSource rangeOfString:startPt2])];
            trimmedSource = [trimmedSource substringToIndex:[trimmedSource rangeOfString:@"\""].location];

            NSURL *url = [NSURL URLWithString:trimmedSource];
            NSData *data = [NSData dataWithContentsOfURL:url];
            UIImage *image = [UIImage imageWithData:data];

            dispatch_async(dispatch_get_main_queue(), ^(void){
                cell.picture.image = image;
            });
        });
        dispatch_release(someQueue);

        return cell;
    }

ここに画像の説明を入力

4

1 に答える 1

0

遅延の原因となっている可能性のあるものについては、バックグラウンド スレッドに入れます。UI を更新する準備ができたら、メイン スレッドで更新します。たぶん、試しにGCDを与えることができます-

dispatch_queue_t someQueue = dispatch_queue_create("cell background queue", NULL);
dispatch_async(someQueue, ^(void){

    NSURL *url = [NSURL URLWithString:trimmedSource];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];

    dispatch_async(dispatch_get_main_queue(), ^(void){
        cell.picture.image = image;
    });
});
dispatch_release(someQueue);

編集:

アプリの速度を低下させる可能性のあるプロセスがある場合は、それをバックグラウンド キューに入れます。それらをバックグラウンド キューに入れるには、次を使用しますdispatch_async

dispatch_aysnc(someQueue, ^(void){ 

});

someQueueは、作成したバックグラウンド キューで、作業を実行したい場所です。ただし、UI に関連するものはすべてメイン キューに入れる必要があります。そのため、その中dispatch_asyncに別の を入れdispatch_asyncます。今回はcell.picture.image、メイン キューで UI ( ) を更新する必要があることを指定しますdispatch_get_main_queue()

これで少しは解決することを願っています。

于 2012-11-03T04:21:57.587 に答える