• IOS网络--NSURLConnection


    ¥状态栏中旋转加载图标的显示

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    cancel 停止下载

    1、将url再次包装成一个一个NSURLRequest对象,可被NSURLConnection使用

      1、NSURLRequest * request = [NSURLRequest requestWithURL:url];

      2、 NSURLRequestReloadIgnoringLocalCacheData 忽略本地缓存

        timeoutInterval 等待请求的最大时间

    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20];

    3、请求指定大小的文件、获取当前下载了的大小,封装成range

        NSString * rangeStr = [NSString stringWithFormat:@"bytes=%lld-",[self.downloadSize longLongValue]];

        

        设置请求数据范围、(NSMutableURLRequest中的方法forHTTPHeaderField)

        [request setValue:rangeStr forHTTPHeaderField:@"Range"];

    1、根据request建立网络链接NSURLConnection

    分为三种方式:

    (1)同步请求

    同步请求一般不用,因为会卡UI,但是某些特定情况,有可能用到,银行保证安全,游戏更新

    1》NSURLConnection建立网络连接(同步的)

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

    2》请求后要判断是否请求成功

    if (error) {

            NSLog(@"%@",error);

            return;

        }

    (2)异步请求(block)

    block形式的异步请求

    1.操作简单,返回的是整体数据

      2.不能分步接收,就不能显示进度

    1》发送异步请求

    参数一:队列、获取主队列

    返回值:  1. NSURLResponse *response

        2. NSData *data

      3. NSError *connectionError

    [NSURLConnection sendAsynchronousRequest:request queue:mainQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {--blcok回调,下载完成--}

    2》判断下载成功否?(两种方式)

    1.根据状态码判断

    NSHTTPURLResponse * httpReponse = (NSHTTPURLResponse *)response;

    if (httpReponse.statusCode != 200) {

                NSLog(@"下载出错");

            }

    2.返回数据data存在 && 错误为空

    if (data && !connectionError) {

                self.imageView.image = [UIImage imageWithData:data];

            }else{

                NSLog(@"下载出错");

            }

    (2)异步请求(代理)

    遵守协议NSURLConnectionDataDelegate

    4个代理方法

    可以实时监测下载进度

    1》请求之前,将自己的数据清空

         self.resultData.length = 0;

    2》代理方法进行异步请求

    [NSURLConnection connectionWithRequest:request delegate:self];

    3》实现代理的四个方法

    1.开始准备下载,链接有响应,已经下载完响应头

    -(void)connection:  didReceiveResponse: 

    获取数据的总长度

        self.totalSize = response.expectedContentLength;

    2.正在接收数据,接收响应体,会根据数据大小,反复不间断的接收

    -(void)connection:  didReceiveData: 

      不间断的接收数据、拼接到全局变量里

        [self.resultData appendData:data];

        获取进度比

        float pv = self.resultData.length/self.totalSize;

        更新进度条、用异步、(一些ui上的操作要用异步)

        dispatch_async(dispatch_get_main_queue(), ^{

            self.progressView.progress = pv;

        });

    3已经下载完毕

    -(void)connectionDidFinishLoading:

    4.下载发生错误

    1.断网了

          2.地址出错

    -(void)connection:  didFailWithError: 

    小结:4ge代理方法

    (1)准备下载、链接与响应、已经下载完响应头didReceiveResponse

    获取文件的总大小

    (2)正在下载、反复调用didReceiveData

    更新下载进度

    (3)下载完毕connectionDidFinishLoading

    释放对象、将下载到的数据赋值到需要显示的地方

    (4)下载失败didFailWithError

    释放对象、打印错误信息

  • 相关阅读:
    yum只下载不安装
    知乎的 Flink 数据集成平台建设实践
    饿了么EMonitor演进史
    手机淘宝轻店业务 Serverless 研发模式升级实践
    独家对话阿里云函数计算负责人不瞋:你所不知道的 Serverless
    一文详解物化视图改写
    业务团队如何统一架构设计风格?
    Fluid 给数据弹性一双隐形的翅膀 -- 自定义弹性伸缩
    开源 1 年半 star 破 1.2 万的 Dapr 是如何在阿里落地的?
    Service Mesh 从“趋势”走向“无聊”
  • 原文地址:https://www.cnblogs.com/gaduo/p/4999078.html
Copyright © 2020-2023  润新知