4

同期呼び出しを使用して NSURLConnection 応答をキャッシュするのに問題があります。あるクラスでキャッシュを初期化し、それを別のクラスで使用します。キャッシュ メモリの容量が 100KB に初期化された後、魔法のようにゼロにリセットされることに注目してください。

- (id)init {
    if (self = [super init]) {
         // Creates a custom URL cache that uses both memory and disk.
         NSURLCache *sharedCache = 
         [[NSURLCache alloc] initWithMemoryCapacity:kMemoryCacheSize * 1000000 
         diskCapacity:kDiskCacheSize * 1000000 
         diskPath:diskPath];
         [NSURLCache setSharedURLCache:sharedCache];

        NSLog(@"Cache memory capacity = %d bytes", [[NSURLCache sharedURLCache] memoryCapacity]);
        NSLog(@"Cache disk capacity = %d bytes", [[NSURLCache sharedURLCache] diskCapacity]);

        //[sharedCache release];
    }
    return self;
}
// NSLOG OUTPUT:
// [6842:20b] Cache memory capacity = 100000 bytes
// [6842:20b] Cache disk capacity = 20000000 bytes

別のクラスで...

NSLog(@"Cache memory capacity = %d bytes", [[NSURLCache sharedURLCache] memoryCapacity]);
NSLog(@"Cache disk capacity = %d bytes", [[NSURLCache sharedURLCache] diskCapacity]);
NSLog(@"Cache Memory Usage = %d bytes", [[NSURLCache sharedURLCache] currentMemoryUsage]);
NSLog(@"Cache Disc Usage = %d bytes", [[NSURLCache sharedURLCache] currentDiskUsage]);
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:objectURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:20];
data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"Image Request finished. Error = %@",[error localizedDescription]);
NSLog(@"Cache size after = %d bytes", [[NSURLCache sharedURLCache] currentMemoryUsage]);
// NSLog Output:
// Cache memory capacity = 0 bytes
// Cache Disc Usage = 0 bytes
// Cache Memory Usage = 0 bytes
// Cache disk capacity = 20000000 bytes
// Image Request finished. Error = (null)
// Cache size after = 0 bytes
4

3 に答える 3

4

Webviews を使用するアプリでこの問題が発生しました。なんらかの理由で、webviews が初期化されるときにキャッシュがゼロになりますが、その理由は不明です。このようなアプリでは、setMemoryCapacity: の呼び出しがゼロの場合は無視する NSURLCache サブクラスを使用します。

何かのようなもの:

-(void)setMemoryCapacity:(NSUInteger)memCap
{
    if (memCap == 0)
        return;
   [super setMemoryCapacity:memCap];
}
于 2010-10-02T23:26:10.393 に答える
1

「%p」と [NSURLCache sharedURLCache] を NSLog ステートメントに追加して、共有オブジェクトが同じままであることを確認します。次に、何が起こっているかを確認するために、+[NSURLCache setSharedURLCache:] と -[NSURLCache setMemoryCapacity:] のブレークポイントを追加します。

于 2010-01-28T09:06:01.450 に答える
0

ここでも同じ問題がありました。思考キャッシュはまったく機能しません。UIWebView を使用せずに小さなテスト プロジェクトをセットアップした後、[NSURLCache sharedURLCache] memoryCapacity] は 0 ではなく予想される 10000000 を返します。

幸いなことに、キャッシュはクリアされず、以前にキャッシュされたすべてのオブジェクトが残ります。Dougs のソリューションは魅力的に機能します。

ところで: Web ビューが表示されると、サイズはゼロに設定されます。後で 10000000 に戻して、Web ビューを表示しても、サイズが再びゼロに設定されることはありません。

于 2011-05-26T12:54:16.743 に答える