0

取得した RSS を動的に表示する UITableView があります。RSS をカスタマイズして画像名を返すようにしました。これにより、後ですべてのセルの横に画像を表示するテーブル内のすべてのセルに UIImageView を追加できます。画像の追加

UIImageView *imageView = [[UIImageView alloc] init];
imageView.frame = CGRectMake(0, 0, 40, 40);

NSString *path = [NSString stringWithFormat:@"URL/%@",object.imageName]; //"object" is the returned Object from the RSS, so basically what i am doing is appending the image name to the path url.
NSURL *url = [NSURL URLWithString:path];
NSData *data = [NSData dataWithContentsOfURL:url];
imageView.image = [UIImage imageWithData:data];

[cell addSubview:imageView];
[cell bringSubviewToFront:imageView];

そのため、アプリを実行すると、アプリの実行が遅くなり、短時間停止することさえあります。その理由は、この行で直接イメージ化されたすべての RSS を読み込んでいるためです。NSData *data = [NSData dataWithContentsOfURL:url];

この問題の解決策はありますか?

前もって感謝します


私は実際には別のスレッドで画像を取得することを考えていましたが、

dispatch_queue_t fetchImage = dispatch_queue_create("Fetching Image", NULL);
dispatch_async(fetchImage, ^{
    NSData *data = [NSData dataWithContentsOfURL:url];
});
dispatch_release(fetchImage);

しかし、そうすると、変数「データ」をキューの外で使用できなくなります。何か案が ?

4

3 に答える 3

3
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSString *path = [NSString stringWithFormat:@"URL/%@",object.imageName]; 
        NSURL *url = [NSURL URLWithString:path];
        NSData *data = [NSData dataWithContentsOfURL:url];
        dispatch_async(dispatch_get_main_queue(), ^{
            imageView.image = [UIImage imageWithData:data];
        }); });
于 2013-03-19T14:28:16.370 に答える
0

データを非同期で取得する必要があります。オープン ソース ライブラリを使用すると、次のことが役立つ場合があります。

またはNSURLConnection、非同期モードでクラスを使用することもできます。

于 2013-03-19T14:22:57.880 に答える
0

このメソッド[NSData dataWithContentsOfURL:]は同期的です。呼び出すたびに、完了するまで現在のスレッド (ほぼ間違いなくアプリのメイン スレッド) をブロックします。これは非常に悪いです。UI がぎこちなく感じられるようにする以外に、応答しないアプリを強制終了するウォッチドッグ プロセスがあります。

あなたは本当に非同期ネットワーク呼び出しを使いたいと思っています。を読んでくださいNSURLConnection。ただし、テーブル ビューに表示するために画像を非同期に読み込むという、まさにこの主題に関する多くの記事、ライブラリ、およびサンプルがあることも知っておいてください。おそらく、上の AFNetworking のカテゴリUIImageViewか、SDWebImage のようなライブラリから始めてください。

于 2013-03-19T14:23:35.313 に答える