ASI框架的使用
- 1.同步访问
- 2.异步访问
- 3.块代码方式
- 4.指定selector方法
- 5.POST登陆
- 6.POST JSON
- 7.下载文件
- 8.断点续传
- 9.上传文件
- 10.野指针
导入ASI框架
我们需要导入我们需要的一需要的一些文件
以上的文件都需要在 Build Phases\Compile Sourses -fno-objc-arc 编译标记
添加libz.dylib动态库
1.同步访问
- (void)syncDemo {
1. 只要是网络访问,就有可能出错!
2. 超时时长!
3. 多线程!
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 1. url
NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/videos.json"];
// 2. 请求
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
// 默认的网络请求超时时长 10 秒,
request.timeOutSeconds = 2.0;
// 这种方法不能处理错误,只能根据data是否存在,判断网络请求是否出错!
//NSData *data = [NSData dataWithContentsOfURL:url];
//3.同步启动请求,会阻塞当前线程
[request startSynchronous];
// 出错处理
if (request.error) {
NSLog(@"%@", request.error);
return;
}
//4. 就能够拿到响应的结果
NSLog(@"%@ %@", request.responseData, [NSThread currentThread]);
//5. 如果返回的内容确实是字符串,可以使用 responseString
NSLog(@"%@ %@", request.responseString, [NSThread currentThread]);
//6.如果返回的是字符串我们需要用下面的方法把他初始化为一个NSString类型
//NSString *str = [[NSString alloc] initWithData:request.responseData encoding:NSUTF8StringEncoding];
// NSLog(@"%@", str);
});
}
-
2.异步请求的三种方法
1.代理的实现
2.代码块的实现
3.自行定义指定网络监听方法
// 1. url
NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/videos.json"];
// 2. request
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
// 设置代理
request.delegate = self;
// 3. 启动异步
[request startAsynchronous];
//下边是代理实现的方法
#pragma mark 代理方法
// 开发多线程框架的时候,有一个细节
// 耗时的操作,框架来做,在后台线程,回调方法在主线程做,使用框架的人,不需要关心线程间通讯
- (void)requestStarted:(ASIHTTPRequest *)request {
NSLog(@"%s", __FUNCTION__);
}
- (void)request:(ASIHTTPRequest *)request
didReceiveResponseHeaders:
(NSDictionary*)responseHeaders {
NSLog(@"%s %@", __FUNCTION__, responseHeaders);
}
- (void)requestFinished:(ASIHTTPRequest *)request {
NSLog(@"%s %@ %@", __FUNCTION__,
request.responseString, [NSThread currentThread]);
}
- (void)requestFailed:(ASIHTTPRequest *)request {
NSLog(@"失败 %@", request.error);
}
// 此方法知道就行,一旦实现了这个方法,那么在 requestFinished 方法中,就得不到最终的结果了!
//- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data {
// NSLog(@"%s %@", __FUNCTION__, data);
//}
block代码块
#pragma mark 通过块代码来监听网络请求
- (void)asyncBlockDemo {
// 1. url
NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/videos.json"];
// 2. 请求
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
// 设置代理
request.delegate = self;
// 2.1 块代码回调
// 开始
[request setStartedBlock:^{
NSLog(@"start");
}];
// 接收到响应头
[request setHeadersReceivedBlock:^
(NSDictionary *responseHeaders) {
NSLog(@"block - %@", responseHeaders);
}];
// 接收到字节(下载)
// request setBytesReceivedBlock:^(unsigned long long size, unsigned long long
total) {
//
// }
// 接收到数据,和代理方法一样,一旦设置,在网络完成时,就没有办法获得结果
// 实现这个方法,就意味着程序员自己处理每次接收到的二进制数据!
//[request setDataReceivedBlock:^(NSData *data) {
// NSLog(@"%@", data);
//}];
// 简单的网络访问
__weak typeof(request) weakRequest = request;
[request setCompletionBlock:^{
NSLog(@"block - %@", weakRequest.responseString);
}];
// 访问出错
[request setFailedBlock:^{
NSLog(@"block - %@", weakRequest.error);
}];
// 3. 发起异步
[request startAsynchronous];
}
自行指定网络监听方法
- (void)asyncSelectorDemo {
// 1. url
NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/videos.json"];
// 2. 请求
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
// 指定监听方法 - 接收到服务器的响应头方法没有指定,如果程序中实现,会同样会被调用!
// 开始的方法
[request setDidStartSelector:@selector(start:)];
// 完成的监听
[request setDidFinishSelector:@selector(finished:)];
// 失败的监听
[request setDidFailSelector:@selector(failed:)];
// 需要注意的,以上方法是在修改代理监听的执行方法
// 需要指定代理
request.delegate = self;
// 3. 启动请求
[request startAsynchronous];
}
post登陆
- (void)postLogin {
NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/login.php"];
// POST请求
// 如果要使用 POST 请求,一般都使用 ASIFormDataRequest
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
// 设置httpBody
[request setPostValue:@"zhangsan" forKey:@"username"];
[request setPostValue:@"123" forKey:@"password"];
__weak typeof(request) weakSelf = request;
[request setCompletionBlock:^{
NSLog(@"%@", weakSelf.responseString);
}];
[request startAsynchronous];
}
POST JSON
- (void)postJSON {
NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/post/postjson.php"];
// POST JSON 的请求还是 ASIHTTPRequest
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
// 设置请求方法
[request setRequestMethod:@"POST"];
// 设置二进制数据
NSDictionary *dict = @{@"productId": @(123), @"productName": @"da bao tian tain jian"};
// 序列化,字典转JSON二进制数据
NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL];
[request setPostBody:[NSMutableData dataWithData:data]];
// 设置完成块
__weak typeof(request) weakSelf = request;
[request setCompletionBlock:^{
NSLog(@"%@", weakSelf.responseString);
}];
[request startAsynchronous];
}
POST 上传
- (void)postUpload {
// url 是负责上传文件的脚本
NSURL *url = [NSURL URLWithString:@"http://192.168.31.2/post/upload.php"];
// 上传文件,同样可以在浏览器测试
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
// 设置上传的文件
参数
1. 本地文件的路径
2. 上传脚本中的字段名
ASI会自动计算上传文件的 mime-Type
NSString *path = [[NSBundle mainBundle]
pathForResource:@"demo.jpg" ofType:nil];
[request addFile:path forKey:@"userfile"];
/**
参数
1. 本地文件的路径
2. 保存到服务器的文件名
3. mime-Type
4. 上传脚本中的字段名
*/
[request addFile:path withFileName:@"aaa.jpg" andContentType:@"image/jpg" forKey:@"userfile"];
// 发起网络连接
// 设置完成块
__weak typeof(request) weakSelf = request;
[request setCompletionBlock:^{
NSLog(@"%@", weakSelf.responseString);
}];
[request startAsynchronous];
}
下载
- (void)download {
NSString *urlString = @"http://192.168.31.2/简介.mp4";
urlString = [urlString
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlString];
// 请求
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
// 下载需要指定下载的路径(缓存路径)
NSString *cacheDir =
[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
cacheDir = [cacheDir stringByAppendingPathComponent:@"321.mp4"];
NSLog(@"%@", cacheDir);
// 1.------------------------------------------------------------
// 设置保存下载文件的目标路径!
// !!! 一定要指定文件名,如果指定的是桌面,桌面上的所有文件都会消失!
[request setDownloadDestinationPath:cacheDir];
// 2.------------------------------------------------------------
// 断点续传
[request setAllowResumeForFileDownloads:YES];
// 需要设置临时文件(包含文件名的全路径)
NSString *tmpPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"aaa.tmp"];
[request setTemporaryFileDownloadPath:tmpPath];
// 3.------------------------------------------------------------
// 下载进度跟进
// request.downloadProgressDelegate = self;
// 进度跟进的代理!!!
// 设置代理, id <遵守某一个协议> delegate;
// 设置代理, id delegate;对象不必遵守指定的协议,但是当发生事件的时候,同样会通知代理执行相关的方法!
// 当进度发生变化是,给进度视图发送 setProgress 消息!
request.downloadProgressDelegate = self.progressView;
// 设置完成块
[request setCompletionBlock:^{
NSLog(@"OK");
}];
self.request = request;
[request startAsynchronous];
}
用asi经常犯的野指针错误, nav强引用了vc,vc强引用了progressView,progressView又强引用了Request当vc释放的时候,progressView 也释放了,所以request让progressView更新的时候会产生野指针错误
总结:最近学习了一下ASI怎么用,因为一些老的程序都是asi 的框架替换的话工作量太大,所以就学习了一下,在本篇博客中学习到了asi的同步访问,和异步访问的三种方式
还学习到了 post登陆,和post json,下载文件和上传,和野指针的错误,希望可以供大家学习,有错误的希望大家可以给我留一下言,谢谢
网友评论