1

Flickr から読み込んだ画像をキャッシュしようとしています。同じ画像を読み込む場合は、代わりにキャッシュされたバージョンを使用したいと考えています。何らかの理由で、インターネットから画像をダウンロードすると機能しますが、キャッシュから読み込むと空白の画像が表示されます。cacheData を確認したところ、入力した画像と同じビット量が含まれているため、ファイルの読み込みが機能しているように見えます。

画像をキャッシュする方法は次のとおりです。

+ (void)cachePhoto:(NSData *)photo withKey:(NSString *)key {
    if (photo) {
        NSArray * urlArray = [fileManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask];
        NSURL * targetDirectory = (NSURL *)[urlArray objectAtIndex:0];
        targetDirectory = [targetDirectory URLByAppendingPathComponent:key];
        [photo writeToURL:targetDirectory atomically:YES];
        [cachedPhotos addObject:key];
        NSLog(@"target url %@", targetDirectory);
    }
}

+ (NSData *)photoInCache:(NSString *)key {
    if ([cachedPhotos containsObject:key]) {
        NSString * path = [[cacheDirectory URLByAppendingPathComponent:key] path];
        NSLog(@"path: %@", path);
        return [fileManager contentsAtPath:path];
    } else {
        return nil;
    }
}

そして、それを取り戻すための私のコード:

NSData * cacheData = [PhotoCache photoInCache:key];

if (cacheData) {
    self.imageView.image = [UIImage imageWithData:cacheData];
    [spinner stopAnimating];
    NSLog(@"used cached image");
} else {
    dispatch_queue_t downloadQueue = dispatch_queue_create("get photo from flickr", NULL);
    dispatch_async(downloadQueue, ^{

        NSData * imageData = [[NSData alloc] initWithContentsOfURL:url];
        dispatch_async(dispatch_get_main_queue(), ^{
            [spinner stopAnimating];
            self.imageView.image = [UIImage imageWithData:imageData];
            [PhotoCache cachePhoto:imageData 
                           withKey:key];
        });
    });
}
4

1 に答える 1

0

私はそれを理解しました-ImageViewがまだロードされていない私のprepareForSegueでimageViewにイメージをロードしていました。画像をviewDidLoadにロードしましたが、うまくいきました。コメントで提案されているように、UIImagePNGRepresentationも使用する必要がありました。

于 2012-05-15T18:25:30.673 に答える