3

私は調査してきましたが、この質問に対する答えが見つかりませんでした-sendAsynchronousRequestとdataWithContentsOfURL。

どちらがより効率的ですか? よりエレガント?より安全?等

- (void)loadImageForURLString:(NSString *)imageUrl
{
    self.image = nil;

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:imageUrl]];
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse * response, NSData * data, NSError * connectionError)
     {
         [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
         if (data) {
             self.image = [UIImage imageWithData:data];
         }
     }];
}

また

- (void)loadRemoteImage
{
    self.image = nil;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSData * imageData = [NSData dataWithContentsOfURL:self.URL];
        if (imageData)
            self.image = [UIImage imageWithData:imageData];

        dispatch_async(dispatch_get_main_queue(), ^{
            if (self.image) {
                [self setupImageView];
            }
        });
    });
}
4

2 に答える 2

1

だから私は自分の質問に対する答えを思いつきました.
現在、画像を非同期にロードする主な方法は3つあります。

  1. NSURL接続
  2. GCD
  3. NSOperationQueue

最適な方法の選択は、問題ごとに異なります。
たとえば、 ではUITableViewController、3 番目のオプション ( NSOperationQueue) を使用してすべてのセルの画像を読み込み、画像を割り当てる前にセルがまだ表示されていることを確認します。セルが表示されなくなった場合は、その操作をキャンセルする必要があります。VC がスタックからポップされた場合は、キュー全体をキャンセルする必要があります。

+ GCD を使用するNSURLConnection場合、キャンセルするオプションがないため、その必要がない場合 (たとえば、一定の背景画像をロードする場合) に使用する必要があります。

別の良いアドバイスは、その画像が表示されなくなってもキャッシュに保存し、別の読み込みプロセスを開始する前にキャッシュで検索することです。

于 2013-02-01T20:51:54.630 に答える
0

sendAsynchronousRequestより良く、エレガントで、あなたがそれを何と呼んでも。しかし、個人的には、個別に作成し、そのメソッドとメソッドNSURLConnectionを聞くことを好みます。1. リクエストのタイムアウトを設定します。2.のキャッシュ メカニズムを使用してイメージをキャッシュするように設定します (ただし、信頼性は高くありません)。2. ダウンロードの進行状況を監視します。3.実際のダウンロードが始まる前に受信します (http コード > 400 の場合)。など...また、画像サイズなどの場合や、アプリのその他の要件によっても異なります。幸運を!delegatedataDelegateNSURLRequestNSURLResponse

于 2012-10-26T08:13:02.967 に答える