0

画像のネットワークにアクセスするための優れた機能を構築しようとしています。画像がWeb上で見つかった場合、作成したキャッシュシステムに保存します。画像が既にキャッシュに保存されている場合は、それを返します。関数が呼び出されgetImageFromCache、画像がキャッシュにある場合は画像を返します。そうでない場合は、ネットワークに移動して取得します。

コードは次のようになります。

UIImageView* backgroundTiles = [[UIImageView alloc] initWithImage[self getImageFromCache:@"http://www.example.com/1.jpg"]];

現在、ネットワーク トラフィックによる遅延が大きいため、スレッドの使用に移行しています。そのため、Web から結果を取得する前に、画像に一時画像を表示する必要があります。

UIImageView私が知りたいのは、この関数 (getImageFromCache) によって sに追加され、順番にアクセスされる非常に多くの画像をどのように追跡できるかということです。

そこでは何かがうまくいかない:

-(UIImage*)getImageFromCache:(NSString*)forURL{

    __block NSError* error = nil;
    __block NSData *imageData;
    __block UIImage* tmpImage;

    if(forURL==nil) return nil;

    if(![self.imagesCache objectForKey:forURL])
    {
        // Setting a temporary image until we start getting results
        tmpImage = [UIImage imageNamed:@"noimage.png"];

        NSURL *imageURL = [NSURL URLWithString:forURL];
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
            imageData = [NSData dataWithContentsOfURL:imageURL options:NSDataReadingUncached error:&error];
            if(imageData)
            {
                NSLog(@"Thread fetching image URL:%@",imageURL);
                dispatch_async(dispatch_get_main_queue(), ^{
                    tmpImage = [UIImage imageWithData:imageData];
                    if(tmpImage)
                    {
                        [imagesCache setObject:tmpImage forKey:forURL];
                    }
                    else
                        // Couldn't build an image of this data, probably bad URL
                        [imagesCache setObject:[UIImage imageNamed:@"imageNotFound.png"] forKey:forURL];
                   });
            }
            else
                // Couldn't build an image of this data, probably bad URL
                [imagesCache setObject:[UIImage imageNamed:@"imageNotFound.png"] forKey:forURL];

        });

    }
    else
        return [imagesCache objectForKey:forURL];

    return tmpImage;
}
4

3 に答える 3

1

これはあなたの質問に対する直接的な回答ではありませんが、GCD を使用して非同期に (バックグラウンド スレッドで) ダウンロードする必要がないことをご存知ですか? NSURLConnection とそのデリゲート メソッドを使用するだけです。すべてのコードはメイン スレッド上にありますが、実際の接続とダウンロードはバックグラウンドで行われます。

(そして実際に、これらすべてを処理する MyDownloader クラスを作成しました。

http://www.apeth.com/iOSBook/ch37.html#_http_requests

MyDownloader とそのサブクラス MyImageDownloader に関する部分まで下にスクロールします。これは、まさにここで行う必要があることを実行しています。さらに、その章の後続のコードは、ダウンロードが完了したときに通知を使用する方法を示しており、これらの画像を必要とするテーブル ビューに、画像が到着したばかりの画像ビューを含む行を再読み込みするよう促します。)

于 2013-05-06T17:30:42.443 に答える
1

ゼロから構築するのは良いことですが、すべての作業を保存したい場合は、Web からのリモート画像をサポートする交換用SDWebImageライブラリがドロップされ、一時画像、非同期読み込み、キャッシュなどのすべての機能を備えています。あなたが必要だと言った

于 2013-05-07T08:58:42.907 に答える