使用ASIHTTPRequest和ASIDownloadCache实现本地缓存
NSURL *url = [NSURLURLWithString:@"http://pica.nipic.com/2007-12-12/20071212235955316_2.jpg"];
ASIFormDataRequest *request = [ASIFormDataRequestrequestWithURL:url];//创建数据请求对象
[request setRequestMethod:@"GET"];
[request setTimeOutSeconds:60];
// [request setDelegate:self];//设置代理
// 设置缓存--
ASIDownloadCache *cache = [[ASIDownloadCachealloc]init];//创建缓存对象
NSString *cachePath = [NSHomeDirectory()stringByAppendingPathComponent:@"Documents"]; //设置缓存目录,这里设置沙盒目录下的Documents目录作为缓存目录
NSLog(@"cachepath:%@",cachePath);
[cache setStoragePath:cachePath];
cache.defaultCachePolicy =ASIOnlyLoadIfNotCachedCachePolicy; //设置缓存策略
//每次请求会将上一次的请求缓存文件清除
// request.cacheStoragePolicy = ASICacheForSessionDurationCacheStoragePolicy;
//持久缓存,一直保存在本地(是持久缓存,程序下次启动,缓存仍然还在)
request.cacheStoragePolicy =ASICachePermanentlyCacheStoragePolicy;
request.downloadCache = cache;
[request startAsynchronous];//发送异步请求
//设置网络请求完成后调用的block
[request setCompletionBlock:^{
// NSLog(@"%@",request.responseHeaders);
NSData *data = request.responseData;
self.showImageView.image = [UIImageimageWithData:data];
//---------------判断数据的来源:网络 or缓存------------------
if (request.didUseCachedResponse) {
NSLog(@"数据来自缓存");
} else {
NSLog(@"数据来自网络");
}
}];
//请求失败调用的block
[request setFailedBlock:^{
NSError *error = request.error;
NSLog(@"请求网络出错:%@",error);
}];
在 NSData *data = request.responseData;这一行报警告:::Capturing \'request\'
strongly in this block is likely to lead to a retain cycle..........
先开始我想应该是内存管理的问题,后来想自己使用了arc应该不存在这个问题吧。。后
来朋友说,block里面不能使用自己自定义的属性,因为block是独立的。。网上查了一下
关于block的使用问题,看的懵懵懂懂不太明白,没有理解。。。。没有明白。。这个和
我的程序死掉有什么关系??我写的代码,
照点击打开链接这个网站的写的......
嗯,现在我把设置缓存的代码注释掉了,程序就可以了。。。这个跟缓存有关么?
------------------------------------------------------------------------
点击打开链接 Block的Retain Cycle的解决方法
---------------------------------------
点击打开链接 使用ASIHTTPRequest和ASIDownloadCache实现本地缓存
好啦,这个问题是设置缓存的问题。。
先开始我想应该是内存管理的问题,后来想自己使用了arc应该不存在这个问题吧。。后
来朋友说,block里面不能使用自己自定义的属性,因为block是独立的。。网上查了一下
关于block的使用问题,看的懵懵懂懂不太明白,没有理解。。。。没有明白。。这个和
我的程序死掉有什么关系??我写的代码,
照点击打开链接这个网站的写的......
嗯,现在我把设置缓存的代码注释掉了,程序就可以了。。。这个跟缓存有关么?
------------------------------------------------------------------------
点击打开链接 Block的Retain Cycle的解决方法
---------------------------------------
点击打开链接 使用ASIHTTPRequest和ASIDownloadCache实现本地缓存
好啦,这个问题是设置缓存的问题。。
来朋友说,block里面不能使用自己自定义的属性,因为block是独立的。。网上查了一下
关于block的使用问题,看的懵懵懂懂不太明白,没有理解。。。。没有明白。。这个和
我的程序死掉有什么关系??我写的代码,
照点击打开链接这个网站的写的......
嗯,现在我把设置缓存的代码注释掉了,程序就可以了。。。这个跟缓存有关么?
------------------------------------------------------------------------
点击打开链接 Block的Retain Cycle的解决方法
---------------------------------------
点击打开链接 使用ASIHTTPRequest和ASIDownloadCache实现本地缓存
好啦,这个问题是设置缓存的问题。。
来朋友说,block里面不能使用自己自定义的属性,因为block是独立的。。网上查了一下
关于block的使用问题,看的懵懵懂懂不太明白,没有理解。。。。没有明白。。这个和
我的程序死掉有什么关系??我写的代码,
照点击打开链接这个网站的写的......
嗯,现在我把设置缓存的代码注释掉了,程序就可以了。。。这个跟缓存有关么?
------------------------------------------------------------------------
点击打开链接 Block的Retain Cycle的解决方法
---------------------------------------
点击打开链接 使用ASIHTTPRequest和ASIDownloadCache实现本地缓存
好啦,这个问题是设置缓存的问题。。
关于block的使用问题,看的懵懵懂懂不太明白,没有理解。。。。没有明白。。这个和
我的程序死掉有什么关系??我写的代码,
照点击打开链接这个网站的写的......
嗯,现在我把设置缓存的代码注释掉了,程序就可以了。。。这个跟缓存有关么?
------------------------------------------------------------------------
点击打开链接 Block的Retain Cycle的解决方法
---------------------------------------
点击打开链接 使用ASIHTTPRequest和ASIDownloadCache实现本地缓存
好啦,这个问题是设置缓存的问题。。
我的程序死掉有什么关系??我写的代码,
照点击打开链接这个网站的写的......
嗯,现在我把设置缓存的代码注释掉了,程序就可以了。。。这个跟缓存有关么?
------------------------------------------------------------------------
点击打开链接 Block的Retain Cycle的解决方法
---------------------------------------
点击打开链接 使用ASIHTTPRequest和ASIDownloadCache实现本地缓存
好啦,这个问题是设置缓存的问题。。
照点击打开链接这个网站的写的......
嗯,现在我把设置缓存的代码注释掉了,程序就可以了。。。这个跟缓存有关么?
------------------------------------------------------------------------
点击打开链接 Block的Retain Cycle的解决方法
---------------------------------------
点击打开链接 使用ASIHTTPRequest和ASIDownloadCache实现本地缓存
好啦,这个问题是设置缓存的问题。。
照点击打开链接这个网站的写的......
嗯,现在我把设置缓存的代码注释掉了,程序就可以了。。。这个跟缓存有关么?
------------------------------------------------------------------------
点击打开链接 Block的Retain Cycle的解决方法
---------------------------------------
点击打开链接 使用ASIHTTPRequest和ASIDownloadCache实现本地缓存
好啦,这个问题是设置缓存的问题。。
嗯,现在我把设置缓存的代码注释掉了,程序就可以了。。。这个跟缓存有关么?
------------------------------------------------------------------------
点击打开链接 Block的Retain Cycle的解决方法
---------------------------------------
点击打开链接 使用ASIHTTPRequest和ASIDownloadCache实现本地缓存
好啦,这个问题是设置缓存的问题。。
嗯,现在我把设置缓存的代码注释掉了,程序就可以了。。。这个跟缓存有关么?
------------------------------------------------------------------------
点击打开链接 Block的Retain Cycle的解决方法
---------------------------------------
点击打开链接 使用ASIHTTPRequest和ASIDownloadCache实现本地缓存
好啦,这个问题是设置缓存的问题。。
ViewController.m
@interface ViewController (){
ASIDownloadCache *myCache;
}
修改缓存的代码:
// 设置缓存--
ASIDownloadCache *cache = [[ASIDownloadCachealloc]init];//创建缓存对象
myCache = cache;
//路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentDirectory = [pathsobjectAtIndex:0];
NSLog(@"path-%@",documentDirectory);
//设置缓存存放路径
[myCachesetStoragePath:[documentDirectorystringByAppendingPathComponent:@"pic"]];
myCache.defaultCachePolicy =ASIOnlyLoadIfNotCachedCachePolicy; //设置缓存策略
//每次请求会将上一次的请求缓存文件清除
// request.cacheStoragePolicy = ASICacheForSessionDurationCacheStoragePolicy;
//持久缓存,一直保存在本地(是持久缓存,程序下次启动,缓存仍然还在)
request.cacheStoragePolicy =ASICachePermanentlyCacheStoragePolicy;
request.downloadCache = cache;
-----------------
打印了路径,前往文件夹,输入路径,就的到以下图示:
----------------
源代码:
点击打开链接
- 4楼wwwang89123昨天 12:27
- 额,换成这个__block ASIFormDataRequest *request = [ASIFormDataRequestrequestWithURL:url];,也不行么?
- Re: willingYaTou昨天 12:34
- 回复wwwang89123n报错:2013-10-15 12:27:36.349 ASIHttpRequestDemo 1[1715:4107] -[__NSCFSet defaultCachePolicy]: unrecognized selector sent to instance 0x7246b20n2013-10-15 12:27:36.351 ASIHttpRequestDemo 1[1715:c07] 请求网络出错:Error Domain=ASIHTTPRequestErrorDomain Code=10 "NSInvalidArgumentException" UserInfo=0xf22db00 {NSLocalizedFailureReason=-[__NSCFSet defaultCachePolicy]: unrecognized selector sent to instance 0x7246b20, NSUnderlyingError=0xf22dae0 "The operation couldn’t be completed. (ASIHTTPRequestErrorDomain error 10.)", NSLocalizedDescription=NSInvalidArgumentException}
- 3楼willingYaTou昨天 12:24
- http://blog.csdn.net/itianyi/article/details/8715857 Block的Retain Cycle的解决方法n一个使用Block语法的实例变量,在引用另一个实例变量的时候,经常会引起retain cycle。这个问题在使用ASIHTTPRequest的block语法的时候会时不时的碰到。nn<span style="font-size:18px;">/* ViewController.h */ n#import <UIKit/UIKit.h> n ntypedef void (^ABlock)(void); //定义一个简单的Block n n@interface ViewController : UIViewController { n NSMutableArray *_items; n ABlock _block; n} n n@end n n/* ViewController.m */ n n#import "ViewController.h" n n@implementation ViewController n n- (void)viewDidLoad n{ n [super viewDidLoad]; n // Do any additional setup after loading the view, typically from a nib. n _items = [[NSMutableArray alloc] init]; n _block = ^{ n [_items addObject:@"Hello!"]; //_block引用了_items,导致retain cycle。 n }; n} nnXcode在编译以上程序的时候会给出一个警告:Captureing ‘self’ strongly in this block is likely to lead to a retain cycle。原因是_items实际上是self->items。_block对象在创建的时候会被retain一次,因此会导致self也被retain一次。这样就形成了一个retain cycle。
- 2楼willingYaTou昨天 12:24
- 我这个程序逻辑有没有错???那个缓存对不对??
- 1楼wwwang89123昨天 11:21
- 哦,你的程序是crash嘛?还是就只是这一个警告而已?能够请求得到数据么?__block ASIFormDataRequest *request = [ASIFormDataRequestrequestWithURL:url];,你把这一句话这样改一下,试一下看行不行?
- Re: willingYaTou昨天 12:16
- 回复wwwang89123n2013-10-15 12:24:48.110 ASIHttpRequestDemo 1[1597:1307] -[__NSCFSet defaultCachePolicy]: unrecognized selector sent to instance 0x72730c0n2013-10-15 12:24:48.112 ASIHttpRequestDemo 1[1597:c07] 请求网络出错:Error Domain=ASIHTTPRequestErrorDomain Code=10 "NSInvalidArgumentException" UserInfo=0x7274170 {NSLocalizedFailureReason=-[__NSCFSet defaultCachePolicy]: unrecognized selector sent to instance 0x72730c0, NSUnderlyingError=0x7274150 "The operation couldn’t be completed. (ASIHTTPRequestErrorDomain error 10.)", NSLocalizedDescription=NSInvalidArgumentException}
- Re: willingYaTou昨天 12:22
- 回复wwwang89123n警告问题,,使用_weak asiformdatarequest *weakRequest=request;nnNSData *data = weakRequest.responseData改了。。现在是它没有执行到block里面去。。。。最后就crash掉了