同步与异步访问网络

访问网络的基本流程

  • 1、构造NSURL地址
  • 2、生成NSURLRequest请求
  • 3、通过NSURLConnection发送请求
  • 4、通过返回NSURLResponse实例和NSError实例分析结果
  • 5、接收返回数据

同步请求与异步请求的比较

  • 1、同步请求无法取消,异步请求过程中可以取消
  • 2、同步请求无法监听加载进度,异步请求可以监听,
  • 3、同步请求在主线程中执行,加载需要时间,会阻塞主线程

同步请求—–示例

    //1、构建URL地址
    NSURL *url = [NSURL URLWithString:@"网址"];

    //2、构建请求NSURLRequest,NSURLRequest:不可变对象,不能动态的添加请求信息
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
   [request setHTTPMethod:@"GET"];//2.1 设置请求方式,都大写
   [request setTimeoutInterval:60];//2.2 设置超时时间
    //2.3 设置请求头信息
//    [request setAllHTTPHeaderFields:(NSDictionary *)];
//    [request setValue:(NSString *) forHTTPHeaderField:(NSString *)];
//    [request addValue:(NSString *) forHTTPHeaderField:(NSString *)];
    [request setValue:@"gzip" forHTTPHeaderField:@"Acc"];  
    [request setHTTPBody:data];//2.4 设置请求体
    [request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];//2.5 设置缓存策略

    //3、构造NSURLConnection
    NSHTTPURLResponse *response = nil;
    NSError *error = nil;
    //发送同步请求
    NSData *data = [NSURLConnection sendSynchronousRequest:request
                                         returningResponse:&response
                                                     error:&error];

    //4、获取数据显示---响应
    //将data转为字符串
    NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    _textView.text = jsonStr;

    //解析json数据
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data
                                                        options:NSJSONReadingMutableContainers
                                                          error:nil];
    NSLog(@"数据结果: %@", dic);
    //5、获取响应信息
    NSInteger statusCode = response.statusCode;
    NSDictionary *allHeaderFields = response.allHeaderFields;

    NSLog(@"statusCode is %ld", statusCode);
    NSLog(@"allHeaderFields is %@", allHeaderFields);

//——————————异步请求方法一:block示例
无法监听数据,也无法监听进度
    //1、构建URL
    NSURL *url = [NSURL URLWithString:@""];

    //2、构建Request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setTimeoutInterval:60];
    [request setHTTPMethod:@"POST"];
    //添加数据请求—请求体
    NSString *parasText = @"cinema_id=1533";
    NSData *data = [parasText dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:data];

    //3、发送请求
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:queue
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                               if (connectionError) {
                                   return ;
                               }
                               //此时是在多线程中
                               NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

                               //回到主线程中刷新UI
                               dispatch_async(dispatch_get_main_queue(), ^{
                                   _textView.text = jsonStr;
                               });
                           }];

异步请求方法一:block示例

   无法监听数据,也无法监听进度
    //1、构建URL
    NSURL *url = [NSURL URLWithString:@""];

    //2、构建Request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setTimeoutInterval:60];
    [request setHTTPMethod:@"POST"];
    //添加数据请求—请求体
    NSString *parasText = @"cinema_id=1533";
    NSData *data = [parasText dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:data];

    //3、发送请求
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:queue
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                               if (connectionError) {
                                   return ;
                               }
                               //此时是在多线程中
                               NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

                               //回到主线程中刷新UI
                               dispatch_async(dispatch_get_main_queue(), ^{
                                   _textView.text = jsonStr;
                               });
                           }];

异步请求方法一:delegate示例

//1、构建URL
    NSURL *url = [NSURL URLWithString:@""];

    //2、构建Request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setTimeoutInterval:60];
    [request setHTTPMethod:@"POST"];
    //添加数据请求
    NSString *parasText = @"cinema_id=1533";
    NSData *data = [parasText dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:data];

    //3、发送请求
    [NSURLConnection connectionWithRequest:request delegate:self];
    /*
     通信协议:NSURLConnectionDelegate
     方法:
     1、NSURLConnectionDataDelegate
     2、NSURLConnectionDownloadDelegate
     子协议
     */
#pragma mark -NSURLConnectionDataDelegate协议方法
//接受到服务器的响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response;

//接受传输的数据,若数据量够大,此方法会被调用多次,数据是分批次传输的,在此方法中拼接:appendData
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

//数据接收完成,在此方法中,把文件写进沙盒里,
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

//请求失败时调用的协议方法
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

//将数据保存进沙盒
    //将接收到的数据保存到沙盒里
    //路径是绝对路径,stringByAppendingString:拼接路径不要忘记前边+ /
    [self.receiveData writeToFile:[NSHomeDirectory() stringByAppendingString:@"/QQMusic.dmg"] atomically:YES];

异步请求方法一:子线程法

  开辟一个子线程,在子线程中同步请求,然后回到主线程设置UI
子线程调用的方法最好加到自动释放池中去
@autoreleasepool { } 

目录

[TOC]来生成目录:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值