同步中我们总结了GET和POST的区别, 下面在开始请求数据之前总结一下同步和异步的区别, 方便理解本文, 不至于混淆.
首先, 要想实现网络访问, 必须在工程中的info.plist文件里添加:
网络请求,允许 Http 请求Step1:
NSAppTransportSecurity 类型 Dictionary 下添加
NSAllowsArbitraryLoads 类型 Boolean ,值设为 YES
Step2:(在异步实现请求时, 可以使用block和代理两种方式, 在使用代理时, 需要遵循协议如下)
遵循NSURLConnectionDataDelegate协议
总结: 同步和异步的区别
- 同步和异步的区别是在接受数据的方法上, 由于两种请求方式的不同, 调用的获取数据的方法也不同.
1.1 同步: 在获取数据的时候, 需要用定义一个NSData的数据来接受(而且只有一种获取数据的方式)
1.2异步: 在获取数据的时候, 不需要再定义接受数据的对象, 因为在获取数据的方法中, 就已经给出了接受数据的Data对象
1.3异步: 另外异步有两种获取数据的方式, block + 代理方式
1. 异步GET
- (void)getYB{
//第一步: 创建URL
NSURL *url = [NSURL URLWithString:GET_URL];
//第二步: 创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//第三步: 接收数据
//方法一: Block
//参数一: 请求对象
//参数二: 线程队列 block在哪个线程中运行,[NSOperationQueue mainQueue]主队列(串行队列)
//参数三: block
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//response: 携带接口的信息
//data: 请求回来的数据
//判断错误信息
if (connectionError == nil) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"GET异步 = %@", dic);
}
}];
#**********************上面是Block方式/ 下面是代理方式 两者实现一种就可以*********************************
//方法二: 代理
//参数一: 请求对象
//参数二: 代理人
[NSURLConnection connectionWithRequest:request delegate:self];
# 代理方法在文章结尾实现
}```
###2. 异步POST
```code
- (void)postYB{
//第一步: 创建URL地址
NSURL *url = [NSURL URLWithString:POST_URL];
//第二步: 创建请求Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//第三步: 设置Body
//1. 设置body信息
NSString *bodyStr = POST_BODY;
NSData *bodyData = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:bodyData];
//2. 设置请求信息(大写)
[request setHTTPMethod:@"POST"];
//第四步: 建立连接
//第一种方法:BLOCK
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//第五步: 判断错误信息
if (connectionError == nil) {
//解析数据
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"Post异步 = %@", dic);
}
}];
#**********************上面是Block方式/ 下面是代理方式 两者实现一种就可以*********************************
//第二种方法:代理
[NSURLConnection connectionWithRequest:request delegate:self];
# 代理方法在文章结尾实现
}```
###代理方法实现
```code
#pragma mark ************ 异步POST/GET代理方法 -------
//服务器开始响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
//初始化(在延展部分创建的全局数据源对象, 用来存放获取到的数据)
self.resultData = [NSMutableData data];
}
//开始接受数据(该方法重复执行)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
//数据并不是一次性接受完成的, 所以需要将每次得到的数据拼接到self.resultData 中
[self.resultData appendData:data];
NSLog(@" ---- %@", self.resultData);
}
//结束服务器
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.resultData options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"GET代理 = %@", dic);
}```