ASI-demo

穆彬郁
2023-12-01
#import "ViewController.h"
#import "ASIHTTPRequest.h"      //GET请求
#import "ASINetworkQueue.h"     //请求队列
#import "ASIFormDataRequest.h"  //POST请求
#import "ASIDownloadCache.h"    //缓存类

@interface ViewController ()

{
    ASIHTTPRequest *_request;
    ASINetworkQueue *_asiQueue;
}

@property(nonatomic,assign)IBOutlet UIImageView *imageView;
@property(nonatomic,assign)IBOutlet UIButton *button;
@property(nonatomic,assign)IBOutlet UIButton *cancelbButton;

@end

@implementation ViewController
/**
 *      self.myURLStr = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=3";
 self.myURLStr = @"http://farm3.staticflickr.com/2846/9823925914_78cd653ac9_b_d.jpg";
 self.myURLStr = @"http://photo.candou.com/i/114/826ea823e8ffe792a6fda9e126f6c404";
 */

- (void)viewDidLoad {
    [super viewDidLoad];

    self.imageView.backgroundColor = [UIColor grayColor];
}

-(IBAction)buttonClick:(id)sender{

//    NSString *urlStr = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=3";
    NSString *urlStr = @"http://photo.candou.com/i/114/826ea823e8ffe792a6fda9e126f6c404";
    
    NSURL *url = [NSURL URLWithString:urlStr];
    
    NSString *postUrl1 = @"http://localhost/cgi-bin/post1.cgi";
    NSString *postUrl2 = @"http://localhost/cgi-bin/post2.cgi";
    NSURL *urlPost1 = [NSURL URLWithString:postUrl1];
    NSURL *urlPost2 = [NSURL URLWithString:postUrl2];

    NSString *downUrl = @"http://baoxu.local/share/Hao_06/resources.zip";
    NSURL *urlDown = [NSURL URLWithString:downUrl];
    
    //GET
    //1.同步请求
//    [self syncDownload:url];
    //2.异步请求
//    [self asyncDownload:url];
    //3.队列请求
//    [self queueRequset:url];
    
    //POST
    //4.psot1类型
//    [self postRequset:urlPost1];
    //5.post2类型
//    [self postUpload:urlPost2];
    
    //6.文件下载
//    [self downloadFile:urlDown];
    //7.缓存设置
    [self cacheASIRequest:urlDown];
    
}

-(IBAction)cancelButtonClick:(id)sender{
    //取消请求
    [self cancelRequest];
}

#pragma mark -ASI缓存-
-(void)cacheASIRequest:(NSURL*)url{
    
    //默认的缓存所有的GET请求
    [ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];
    
    //单独设置某个请求使用缓存
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDownloadCache:[ASIDownloadCache sharedCache]];
    
    request.cachePolicy = ASIDontLoadCachePolicy;
    
}

#pragma mark -下载文件-

-(void)downloadFile:(NSURL*)url{

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
    //设置临时缓存文件目录
    request.temporaryFileDownloadPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/resources.zip.tmp"];
    //每次下载到数据碎片,储存到这个目录,拼接到一个临时文件上
    //下载全部完成后,移到的目录
    request.downloadDestinationPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/resources.zip"];
    
    request.didFinishSelector = @selector(downloadOK:);
    request.didFailSelector = @selector(downloadNotOK:);
    request.didReceiveResponseHeadersSelector = @selector(downloadBegin:);

    
    //设置下载进度的代理
    request.downloadProgressDelegate = self;
    
    //是否允许断点续传
    request.allowResumeForFileDownloads = YES;
    
    request.delegate = self;
    
    [request startAsynchronous];
}

-(void)downloadBegin:(ASIHTTPRequest*)request{
    NSDictionary* dict = request.responseHeaders;
    NSLog(@"dict:%@",dict);
}

-(void)downloadOK:(ASIHTTPRequest*)request{
    NSLog(@"OK:%@",request.responseData);
}

-(void)downloadNotOK:(ASIHTTPRequest*)request{
    NSLog(@"notOK:%@",request.error);
}

//监控下载进度<ASIProgressDelegate>
- (void)request:(ASIHTTPRequest *)request didReceiveBytes:(long long)bytes{
    NSLog(@"bytes:%lld",bytes);
}


#pragma mark -POST上传-
-(void)postUpload:(NSURL*)url{
    //创建数据类型的请求
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    
    //设置文件
    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"default" ofType:@"png"];
    [request setFile:filePath forKey:@"file"];
    
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    [request addData:data forKey:@"data"];
    
    request.didFinishSelector = @selector(requestOK:);
    request.didFailSelector = @selector(requestNotOK:);
    request.delegate = self;
    
    //发送
    [request startAsynchronous];

}


#pragma mark -POST请求-
-(void)postRequset:(NSURL*)url{
    //创建数据类型的请求
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    
    //可以自动识别发送的数据类型
    //创建键值对

    [request setPostValue:@"王失聪" forKey:@"username"];
    [request setPostValue:@"woxiangjingjing" forKey:@"password"];
    [request setPostValue:@"aslfjlas;fh;sah" forKey:@"messge"];
    request.didFinishSelector = @selector(requestOK:);
    request.didFailSelector = @selector(requestNotOK:);
    request.delegate = self;
    
    //发起请求
    [request startAsynchronous];
    
}
-(void)requestOK:(ASIFormDataRequest*)request{
    NSLog(@"%@",request.responseString);
}
-(void)requestNotOK:(ASIFormDataRequest*)request{
    NSLog(@"%@",request.error);
}


#pragma mark -队列请求-

-(void)queueRequset:(NSURL*)url{
    _request = [ASIHTTPRequest requestWithURL:url];
    
    _request.delegate = self;
    //设置回调方法
    _request.didFinishSelector = @selector(didFinish:);
    _request.didFailSelector = @selector(didFailed:);
    //ps:如果其他代理方法中实现了didReceiveData这个方法,那么上面的方法不能返回数据(测试发现)
    
    //实例化ASI的线程队列(继承自官方队列)
    _asiQueue = [[ASINetworkQueue alloc]init];
    _asiQueue.maxConcurrentOperationCount = 3;
    
    //运行队列
    [_asiQueue go];
    //将请求添加到队列,即开始请求数据
    [_asiQueue addOperation:_request];
}

-(void)cancelRequest{
    //_request:
    //取消请求(如果下载完成则不允许取消,)
    if (_request) {
        [_request cancel];
    }
    
    //取消所有的回调
    [_request clearDelegatesAndCancel];
    
    //通过队列取消请求
    _asiQueue.shouldCancelAllRequestsOnFailure = YES;
    [_asiQueue cancelAllOperations];
    
}

-(void)didFinish:(ASIHTTPRequest*)request{
    _request = nil;
    NSLog(@"%@",request.responseString);
    self.imageView.image = [UIImage imageWithData:request.responseData];
}
-(void)didFailed:(ASIHTTPRequest*)request{
    _request = nil;
    NSLog(@"%@",request.error);
}


#pragma mark -异步下载-

-(void)asyncDownload:(NSURL*)url{
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
    request.delegate = self;
    /**
     request下载完毕会收到回调
     将代理通过set语法传过去
     采用的是隐式代理,就是说没有声明协议,直接让delegate调用方法
     */
    
    //开始异步
    [request startAsynchronous];
}

/**
 ASIHTTPRequestDelegate
 */
- (void)requestFinished:(ASIHTTPRequest *)request{
    
    NSLog(@"下载成功,请求到的数据为:%@",request.responseString);
    self.imageView.image = [UIImage imageWithData:request.responseData];
}
- (void)requestFailed:(ASIHTTPRequest *)request{
    NSLog(@"下载失败:%@",request.error);
}
//- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data{
//    NSLog(@"下载ing。。。");
//}

#pragma mark -同步下载-

-(void)syncDownload:(NSURL*)url{
    //创建ASI请求
    ASIHTTPRequest *requset = [ASIHTTPRequest requestWithURL:url];
    //启动同步
    [requset startSynchronous];
    //返回结果
    NSError *error = requset.error;
    if (error) {
        NSLog(@"同步下载出错:%@",error);
        
    }else{
        /**
         *  requset.responseString
            requset.responseData
         */
        NSLog(@"下载成功,请求到的数据为:%@",requset.responseString);
        self.imageView.image = [UIImage imageWithData:requset.responseData];
    }
}


//	ASIUseDefaultCachePolicy = 0
//    默认缓存策略 不能和其他缓存侧略共有
//    有缓存的数据 不再下了

//	ASIDoNotReadFromCacheCachePolicy = 1,
//    所有数据不使用缓存

//	ASIDoNotWriteToCacheCachePolicy = 2,
//    不会修改已经得到的缓存

//	ASIAskServerIfModifiedWhenStaleCachePolicy = 4,
//先判断是否存在缓存,存在且没有过期,不请求了。否则都请求。如果过期,会自动判断数据和将要下载的数据有没有变化,如果有变化,下载,没变化不下载。下载后会更新缓存

//	ASIAskServerIfModifiedCachePolicy = 8,
//与上述几乎一样,每次都会判断数据有没有变化

//	ASIOnlyLoadIfNotCachedCachePolicy = 16,
//如果有本地缓存,无论是否过期都使用缓存

//	ASIDontLoadCachePolicy = 32,
//不下载,有缓存请求执行,没缓存直接取消请求

//	ASIFallbackToCacheIfLoadFailsCachePolicy = 64
//这选项多与其他策略结合使用,当下载失败时使用缓存。


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

 类似资料: