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下载小型测试项目
没有找到相关结果
已邀请:
5 个回复
玖料萄
检查遵循的路径,并检查request.responseData的大小。 **编辑** 您的问题是您对didReceiveData的使用:
引用asi http请求文档: 如果您需要将响应处理为 它进来(例如,您想 使用流解析器解析 仍在回应 下载),请您的代表 实现request:didReceiveData:(请参见 ASIHTTPRequestDelegate.h)。注意 当您这样做时,ASIHTTPRequest将 不填充responseData或写 对downloadDestinationPath的响应- 您必须自己存储响应 如果你需要。 最后一句话似乎也适用于缓存数据。 它可能是asihttprequest中的一个错误,实际上,在这种情况下,它要么不应该将数据写入高速缓存,要么应该确保它正在写入有效的数据-当前看起来像在写入无效的高速缓存条目。您需要在数据到达时对其进行处理吗?如果不是,则仅删除\'didReceiveBytes \',仅使用requestFinished中request.responseData中提供的数据。
拈吉勉犬姆
倪蕊悲潍
提孺局缎
然后尝试将此方法更改为:
并确保您将
用作
炉挤仙挟
注释掉此方法后,调用的requestDone方法将具有整个请求内容,并因此具有大小。