最初に画像を既にダウンロードしているかどうかを確認し、そうでない場合は URL から画像を取得してアプリの docs ディレクトリにキャッシュします。存在する場合は、単にそれを取得し、インターネットに接続している場合は再ダウンロードします. 以下に 2 つの方法を示します。
- (UIImage *) getImageFromUserIMagesFolderInDocsWithName:(NSString *)nameOfFile
{
UIImage *image = [UIImage imageNamed:nameOfFile];
if (!image) // image doesn't exist in bundle...
{
// Get Image
NSString *cleanNameOfFile = [[[nameOfFile stringByReplacingOccurrencesOfString:@"." withString:@""]
stringByReplacingOccurrencesOfString:@":" withString:@""]
stringByReplacingOccurrencesOfString:@"/" withString:@""];
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/%@.png", cleanNameOfFile]];
image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfFile:filePath]];
if (!image)
{
// image isn't cached
image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:nameOfFile]]];
[self saveImageToUserImagesFolderInDocsWithName:cleanNameOfFile andImage:image];
}
else
{
// if we have a internet connection, update the cached image
/*if (isConnectedToInternet) {
image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:nameOfFile]]];
[self saveImageToUserImagesFolderInDocsWithName:cleanNameOfFile andImage:image];
}*/
// otherwise just return it
}
}
return image;
}
画像の保存はこちら
- (void) saveImageToUserImagesFolderInDocsWithName:(NSString *)nameOfFile andImage:(UIImage *)image
{
NSString *pngPath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/%@.png", nameOfFile]];
[UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES];
NSLog(@"directory: %@", [[UIImage alloc] initWithContentsOfFile:pngPath]);
}
画像は既に正常にダウンロードされ、ドキュメント ディレクトリにキャッシュされています (ファイル システムで確認できるのでわかります)。そして、このメソッドを初めて呼び出したときに画像を正常に再読み込みしますが、別のビューに移動して、同じビューに戻ったときにこのメソッドを再度呼び出すと、空白になります。それでも、URLは正しいです。ここで何が問題なのですか?