画像のネットワークにアクセスするための優れた機能を構築しようとしています。画像が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;
}