ASIHTTPRequest-缓存中的数据始终为空

| 我正在iPhone / iPad应用程序中下载图像-由于大多数时候它们都保持不变,因此我想将它们缓存在磁盘上:
ASIDownloadCache *cache = [ASIDownloadCache sharedCache];
[asiRequest setDownloadCache:cache];
[asiRequest setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
[asiRequest setCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];
[asiRequest setSecondsToCache:60*60*24*30]; // Cache for 30 days
[asiRequest setDelegate:self]; // A delegate must be specified
[asiRequest setDidFinishSelector:@selector(requestFinished:)];
[asiRequest startAsynchronous];
在我的requestFinished方法中,可以识别出缓存已成功,但是我的请求对象中的数据是empyt。我想念什么?
- (void) requestFinished:(ASIHTTPRequest *)request {
   if ([request didUseCachedResponse]) {
       NSLog(@\"cache, size: %i\", [[request responseData] length]); // is always zero
       [self buildImageWithData:[request responseData]];
   }
   [...];
}
非常感谢! 编辑1:我的完整代码不起作用:第一次,我得到\“ not cached \”语句,从那时起,\“ cache,大小:0 \” ...我不知道为什么:(
- (void)viewDidLoad {
    [super viewDidLoad];

    for (int i = 0; i < 10; i++) {
        asiRequest = [[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:@\"http://www.myimageserver.com/myimage.jpg\"]];

        ASIDownloadCache *cache = [ASIDownloadCache sharedCache];
        [asiRequest setDownloadCache:cache];
        [asiRequest setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
        [asiRequest setCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];
        [asiRequest setSecondsToCache:60*60*24*30]; // Cache for 30 days
        [asiRequest setDelegate:self]; // A delegate must be specified
        [asiRequest setDidFinishSelector:@selector(requestFinished:)];
        [asiRequest startAsynchronous];
    }
}

- (void) request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders {
    self.imageDataLoadedFromURL = [NSMutableData data];
}

- (void) request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data {
    [imageDataLoadedFromURL appendData:data];
}

- (void) requestFinished:(ASIHTTPRequest *)request {
    if ([request didUseCachedResponse]) {
        NSLog(@\"cache, size: %i\", [[request responseData] length]); // is always zero
    } else {
        NSLog(@\"not cached\");
    }
}
编辑2:似乎缓存已经包含0字节图像;所以这不是从缓存读取而是写入的问题... 编辑3:您可以从http://tinyurl.com/68wuwj2下载小型测试项目     
已邀请:
        您可以设置一个断点,清除缓存(例如删除您的应用程序),然后逐步执行以下代码段(ASIDownloadCache.m,第184行,方法storeResponseForRequest):
if ([request responseData]) {
    [[request responseData] writeToFile:dataPath atomically:NO];
} else if ([request downloadDestinationPath] && ![[request downloadDestinationPath] isEqualToString:dataPath]) {
    NSError *error = nil;
    [[[[NSFileManager alloc] init] autorelease] copyItemAtPath:[request downloadDestinationPath] toPath:dataPath error:&error];
}
检查遵循的路径,并检查request.responseData的大小。 **编辑** 您的问题是您对didReceiveData的使用:
- (void) request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data {
    [imageDataLoadedFromURL appendData:data];
}
引用asi http请求文档:   如果您需要将响应处理为   它进来(例如,您想   使用流解析器解析   仍在回应   下载),请您的代表   实现request:didReceiveData:(请参见   ASIHTTPRequestDelegate.h)。注意   当您这样做时,ASIHTTPRequest将   不填充responseData或写   对downloadDestinationPath的响应-   您必须自己存储响应   如果你需要。 最后一句话似乎也适用于缓存数据。 它可能是asihttprequest中的一个错误,实际上,在这种情况下,它要么不应该将数据写入高速缓存,要么应该确保它正在写入有效的数据-当前看起来像在写入无效的高速缓存条目。您需要在数据到达时对其进行处理吗?如果不是,则仅删除\'didReceiveBytes \',仅使用requestFinished中request.responseData中提供的数据。     
        您的代码对我来说似乎是正确的。 我唯一能想到的是,您的缓存中可能有一些“损坏的”数据,就像存储零长度数据的情况一样。您可以尝试一次删除缓存,也可以只使用一次“ 5”策略(以便“清除”缓存)。 如果这样做没有帮助,我将在您的ѭ6中放入一个断点,然后从那里检查在据称从缓存中检索到数据时ASIHTTP中到底发生了什么。这比听起来容易。     
        注释掉此方法:
(void) request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data
{
   [imageDataLoadedFromURL appendData:data];
}
    
        尝试使用它并告诉我您得到了什么:
- (void) requestFinished:(ASIHTTPRequest *)request {
    NSLog(@\"Size of received data: %d bytes\",[[request responseData] length]); //THIS LINE

if ([request didUseCachedResponse]) {
    NSLog(@\"cached\");        
} else {
        NSLog(@\"not cached\");
    }
}
然后尝试将此方法更改为:
- (void) request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders {
    [self.imageDataLoadedFromURL setLength:0];
}
并确保您将
self.imageDataLoadedFromURL
用作
NSMutableData
    
        我尝试运行您的应用。亚历山大的建议是正确的。 注释掉此方法:
(void) request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data
注释掉此方法后,调用的requestDone方法将具有整个请求内容,并因此具有大小。     

要回复问题请先登录注册