• 网络数据请求


    网络数据请求

         1.同步:在同一个时间点,只可以做一件事情

         2.异步:在同一个时间点,可以同时做多件事情  

         比较同步和异步

         1.当下载的数据比较小的时候使用同步,反之使用异步

         2.需要上传数据的时候使用异步,例如:上传图片

         3.一般情况下(排除网速等物理环境影响),异步的效率比同步效率要高

    1.使用NSString直接下载数据(同步

        1.拿到网址(字符串)

        NSString *path = [NSString stringWithFormat:@"http://10.0.8.8/sns/my/user_list.php?page=%d&number=%d",1,20];

        

        2.创建NSURL对象,url:统一资源标识符(统一资源定位器)

        NSURL *url = [NSURL URLWithString:path];

        

        3.使用NSString直接下载数据(同步) ,编码格式一般都用UTF-8

        NSError *error;

        NSString *string = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

        if (error) { //如果error有值的话,代表报错 直接打印错误 否则 成功

            NSLog(@"error:%@",error);

        }else {

            NSLog(@"string:%@",string);

        }

    2.使用NSURLConnection的同步方法下载数据

        1.拿到网址路径

        NSString *path = [NSString stringWithFormat:@"http://10.0.8.8/sns/my/user_list.php?page=%d&number=%d",1,20];

        2.创建url对象

        NSURL *url = [NSURL URLWithString:path];

        

        3.获取请求对象,通过url对象得到请求对象

        NSURLRequest *request = [NSURLRequest requestWithURL:url];

        

        4.用NSURLConnection进行发送同步请求 获取NSData数据类型 记住:此方法在iOS9.0之后不支持了

        NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

        

        5.JSON解析

        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

        

        NSLog(@"%@",dic);

    3.使用NSURLConnection的异步方法下载数据

        1.拿到网址路径

        NSString *path = [NSString stringWithFormat:@"http://10.0.8.8/sns/my/user_list.php?page=%d&number=%d",1,20];

        2.创建url对象

        NSURL *url = [NSURL URLWithString:path];

        3.获取请求对象

        NSURLRequest *request = [NSURLRequest requestWithURL:url];

        4.NSURLConnection发送异步请求

        第一个参数:请求对象 第二个参数:代理

        NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    #pragma mark - NSURLConnectionDataDelegate - 协议方法  四种

    遵循协议 实现协议中的方法

    接收到响应 请求开始

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

        NSLog(@"接到响应,请求开始(请求成功)");

        NSHTTPURLResponse *httpURLResponse = (NSHTTPURLResponse *)response;

        //200:正常响应 404请求失败 400:客户端有问题 500:服务端有问题

        //注意:服务端和客户端可以模拟(自定义)自己的状态码

        if (httpURLResponse.statusCode == 200) {

            NSLog(@"正常响应");

        }else {

            NSLog(@"请求有问题 %ld",httpURLResponse.statusCode);

            

        }

        //初始化成员变量_data

        _data = [[NSMutableData alloc] init];

        

        

    }

    接收到数据,请求数据过程中 注意:这个过程是异步的,如果响应数据过大的话需要拼接data

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

        NSLog(@"接收数据过程中");

        [_data appendData:data];

    }

    数据接收完毕后,结束请求响应

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {

        

        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];

        NSLog(@"结束请求:%@",dic);

        

    }

    请求失败

    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

        

        NSLog(@"错误:%@",error);

    }

    4.用NSURLSession的异步方法去下载数据 注意:NSURLSession是iOS7.0版本出现

        1.拿到网址路径

        NSString *path = [NSString stringWithFormat:@"http://10.0.8.8/sns/my/user_list.php?page=%d&number=%d",1,20];

        2.创建url对象

        NSURL *url = [NSURL URLWithString:path];

        3.创建session单例对象 shared开头的单例对象

        NSURLSession *session = [NSURLSession sharedSession];

        4.创建任务

        第一个参数是url对象 第二个参数是代码块(完成结果的代码块)

        NSURLSessionDataTask *dataTask1 = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

            NSHTTPURLResponse *response1 = (NSHTTPURLResponse *)response;

            NSLog(@"状态码:%ld",response1.statusCode);        

            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

                    NSLog(@"%@",dic);

        }];

        5.启动下载

        [dataTask1 resume];

      6. 创建任务2

        NSURLSessionDataTask *dataTask2 = [session dataTaskWithURL:[NSURL URLWithString:@"http://file.youboy.com/a/99/40/34/2/10043032.jpg"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {  

            NSLog(@"%@",data);

            self.myImageView.image = [UIImage imageWithData:data];   //使用故事版拖出一个UIImageView 拖线(属性)命名为myImageView

        }];

       7.启动下载

        [dataTask2 resume];

         了解

         NSURLSessionDataTask 默认的样式 可以上传内容 ,上传完成后再进行下载

         NSURLSessionUploadTask 主要用于上传数据使用,传完以后不会再下载返回结果

         NSURLSessionDownloadTask 必须有下载数据

  • 相关阅读:
    2021.3.3
    2021.3.2
    2021.3.1
    2021.2.28(每周总结)
    2021.2.27
    2021.2.26
    2021.2.25
    2021.2.23
    Redis系统学习之五大基本数据类型(List(列表))
    Redis系统学习之五大基本数据类型(String(字符串))
  • 原文地址:https://www.cnblogs.com/GJ-ios/p/5433616.html
Copyright © 2020-2023  润新知