0

最初に画像を既にダウンロードしているかどうかを確認し、そうでない場合は 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は正しいです。ここで何が問題なのですか?

4

2 に答える 2

0

1) ハードコーディングされたパス (「Documents/xxx」など) に書き込みを行うのではなく、Application Support ディレクトリを要求して使用し、iCloud にアップロードされないようにファイルにマークを付けます (あなたがそれを望まない限り)。詳細については、このリンクを参照してください。その中にサブフォルダーを作成し、iCloud バックアップ用ではないことをマークします。

2) 変更してみてください:

image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:nameOfFile]]];

image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:filePath]]];
于 2012-09-29T21:24:12.470 に答える
0

多分、あなたはすべきです:

image = [UIImage imageWithContentsOfFile: nameOfFile];
于 2012-09-29T17:23:34.097 に答える