0

いくつかの画像をキャッシュに保存する必要があるアプリを書いています。NSCacheでそれを実行しようとしていますが、コードは問題ないようですが、画像をキャッシュに保存しません。私はこのコードを持っています:

キャッシュはグローバルであり、.hで宣言されています。 NSCache *cache;

-(UIImage *)buscarEnCache:(UsersController *)auxiliarStruct{
    UIImage *image;
    [[cache alloc] init];

    NSLog(@"cache: %i", [cache countLimit]);
    if ([cache countLimit] > 0) { //if [cache countLimit]>0, it means that cache isn't empty and this is executed
        if ([cache objectForKey:auxiliarStruct.thumb]){    
            image = [cache objectForKey:auxiliarStruct.thumb];
        }else{ //IF isnt't cached, is saved
            NSString *imageURLString = [NSString stringWithFormat:@"http://mydomain.com/%@",auxiliarStruct.thumb];
            NSURL *imageURL = [NSURL URLWithString:imageURLString];
            NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
            image = [UIImage imageWithData:imageData];
            [cache setObject:image forKey:auxiliarStruct.thumb];
        }        
    }else{ //This if is executed when cache is empty. IS ALWAYS EXECUTED BECAUSE FIRST IF DOESN'T WORKS CORRECTLY
        NSString *imageURLString = [NSString stringWithFormat:@"http://mydomain.com/%@",auxiliarStruct.thumb];
        NSURL *imageURL = [NSURL URLWithString:imageURLString];
        NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
        image = [UIImage imageWithData:imageData];
        [cache setObject:image forKey:auxiliarStruct.thumb];
    }
    return image;
}

この関数は、これを使用して他の関数で呼び出されます。

      UIImage *image = [self buscarEnCache:auxiliarStruct];

これは、画像が画面に表示されているがキャッシュに保存されていないために機能します。失敗すると思われる行は次のとおりです。

[cache setObject:image forKey:auxiliarStruct.thumb]; //auxiliarStruct.thumb is the name of the image

キャッシュが機能しない理由を誰かが知っていますか?ありがとう!!

ps:私の英語でごめんなさい、私は悪いことを知っています

4

2 に答える 2

5

メソッドが呼び出されるたびbuscarEnCache:に、次の行で新しいキャッシュオブジェクトが作成されます。

[[cache alloc] init];

したがって、古いキャッシュがリークされ、使用できなくなります。

cache = [[NSCache alloc] init];クラスのinitメソッドにinを配置します。


countLimitをチェックする必要はありません。

-(UIImage *)buscarEnCache:(UsersController *)auxiliarStruct{
    UIImage *image = [cache objectForKey:auxiliarStruct.thumb];

    if (!image) {    
        NSString *imageURLString = [NSString stringWithFormat:@"http://mydomain.com/%@",auxiliarStruct.thumb];
        NSURL *imageURL = [NSURL URLWithString:imageURLString];
        NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
        image = [UIImage imageWithData:imageData];
        [cache setObject:image forKey:auxiliarStruct.thumb];
    }

    return image;
}

画像のフェッチを別のスレッドで実行されるメソッドに配置し、ある種のプレースホルダー画像を返すことができます。

于 2012-05-30T10:27:49.293 に答える
1

@rckoenesによって提供された回答と同様に、とにかくキャッシュインスタンスを正しく割り当てていません。そのはず:

cache = [[NSCache alloc] init];

これをメソッドに移動する必要がありますinit

于 2012-05-30T10:30:07.643 に答える