同步与异步请求的区别,主要是对于UI冻结的情况是不同的,速度上没什么区别,速度取决于网络情况。但是在UI的反应上,同步请求,在响应数据没有拿到之前UI是不能处理其他事情的,处于一种等待状态;异步请求,在响应数据没有拿到之前UI是不会冻结的,UI仍然可以响应用户的操作。
异步请求的步骤和同步请求的步骤大致是一样的,不过异步请求通过NSURLConnection有两种方式,即:使用代理或者代码块。
1.创建NSURL
NSString *urlString = @"https://api.weibo.com/2/statuses/public_timeline.json?access_token=2.00zMf9ND9ip3KCc14c03c2900L6tAc";
//编码
urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURL *url = [NSURL URLWithString:urlString];
2.创建一个url请求
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
3.建立NSURLConnection发送异步请求
//使用代理发送
[NSURLConnection connectionWithRequest:request delegate:self];
4.使用代理需要实现的一些方法
//需要遵循的协议NSURLConnectionDelegate
@interface ViewController ()<NSURLConnectionDelegate>
//遵循协议需要实现的三个方法
//服务器开始响应,准备向客户发送数据
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(nonnull NSURLResponse *)response{
NSLog(@"服务器开始响应,准备向客户端发送数据");
}
//从服务器接收到数据,并且此方法会执行多次
- (void)connection:(NSURLConnection *)connection didReceiveData:(nonnull NSData *)data{
NSLog(@"从服务器接收到数据,并且此方法会执行多次");
//把下载的数据连续存到_mDataGet中
[_mDataGet appendData:data];
}
//接收数据完成
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSLog(@"接收数据完成");
//数据接收完成,使用NSJSONSerialization解析
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:_mDataGet options:NSJSONReadingAllowFragments error:nil];
WeiBoModel *model = [[WeiBoModel alloc] initWithDictionary:dictionary];
NSString *text = [model.statuses[0] objectForKey:@"text"];
//更新UI需要回到主线程
[self.textView performSelectorOnMainThread:@selector(setText:) withObject:text waitUntilDone:NO];
5.使用代码块
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
WeiBoModel *model = [[WeiBoModel alloc] initWithDictionary:dictionary];
NSString *text = [model.statuses[0] objectForKey:@"text"];
dispatch_async(dispatch_get_main_queue(), ^{
self.textView.text = text;
});