• IOS开发之网络编程(请求数据和断点续传)


    IOS开发中网络编程应用场景:JSON数据获取,网络数据的下载。

    一:请求JSON数据一般用异步请求的方式,如果用同步请求,则会造成IOS界面的执行过程阻塞,即界面部分在请求数据的过程中必须等待数据加载完毕。

    JSON数据的获取步骤:

    1.设置网络地址的字符串:NSString *URLString = @"http://www.baidu.com";

    2.创建URL:NSURL *URL = [NSURL URLWithString:URLString];

    3.创建请求:NSURLRequest *URLRequest = [NSURLRequest requestWithURL:URL];

    4.发送异步请求:

     NSOperationQueue *queue = [[NSOperationQueue alloc] init];

     [NSURLConnection sendAsynchronousRequest:URLRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

                //发送请求完成后的回调Block,用于处理请求到得数据 data

        /*

          此处完成JSON解析data的过程

        */

            }];

    若发送同步请求:

    NSURLResponse *returnResponse; //保存反馈信息

    NSError *error;  //保存错误信息

    NSData *data = [NSURLConnection sendSynchronousRequest:URLRequest returningResponse:&returnResponse error:&error];

    JSON解析data,或查看错误信息,或查看连接反馈信息。

    二:网络数据的断点续传的下载

    断点续传的步骤:

    1.设置下载文件在网络服务器的地址:NSString *fileURL = @"http://www.baidu.com";     //以百度网址为例子

    2.设置本地保存下载文件的地址:NSString *fileSavePath = @"/Users/apple/Downloads/1.temp"; //以mac上下载文件夹的路径为例

    3.实现 开始下载 函数

    - (void)startDownLoad

    {

    #=======================实现断点续传的关键 Start===========================

      //设置文件下载的开始位置,以字节数为计算单位,默认从0开始。

      unsigned long long startBytes = 0;

      //判断文件是否存在,得到整个下载文件的断点字节数的位置

      if ([[NSFileManager defaultManager] fileExistsAtPath:_filePath])

      {

             startBytes = [[NSData dataWithContentsOfFile:_filePath] length];

      }

      else

      {

        [[NSFileManager defaultManager] createFileAtPath:_filePath contents:nil attributes:nil];

      }

      //创建可变的URLRequest,无视缓存,请求超时为10秒

      NSMutableURLRequest *mutableRequest=[NSMutableURLRequest requestWithURL:fileURL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10.0f ];

      //设置请求Head,设置文件传输的起始字节位置

       NSString *rangeValue = [NSString stringWithFormat:@"bytes=%llu-",startBytes]; //这里注意字符串的格式必须正确,一个字符也不能少。

            [mutableRequest addValue:rangeValue forHTTPHeaderField:@"Range"];  //字符串的值必须是@"Range"

    #======================实现断点续传的关键 End=========================

          //建立连接

      NSURLConnection = [NSURLConnection connectionWithRequest:mutableRequest delegate:self]; //此方法一旦建立成功,则直接启动下载

         (人为控制启动下载

      connection = [[NSURLConnection alloc] initWithRequest:mutableRequest delegate:self startImmediately:NO];

      [connection start ];)

    }

    4.中断下载

    - (void)pauseDownLoad

    {

         //取消连接操作

      [connection cancel];

      connection = nil;

      //关闭文件操作

      [outHandle closeFile];

           outHandle = nil;

     }

    #====================下载代理<NSURLConnectionDataDelegate>的实现=========

    //开始下载数据之前执行。

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

    {

      //开启文件,开始写入数据

        _outHandle = [NSFileHandle fileHandleForWritingAtPath:_filePath];

     //获取下载的一些信息

      [response expectedContentLength];  //整个下载文件的大小

        [response MIMEType];  //下载文件的类型

        [response textEncodingName]; //下载的内容字符编码名称

        [response suggestedFilename]; //下载的文件的默认名称

    }

    //收到数据时执行的代码,此方法在下载过程中可能执行多次。

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

    {

       //写入文件操作

        [_outHandle seekToEndOfFile]; 

        [_outHandle writeData:data];

    //或者用可变的data类型接收数据

       [mutableData appedData:data];

    }

     //数据加载完成后执行善后操作

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection

    {

        NSLog(@"下载完成!");

        [_outHandle closeFile];

        _outHandle = nil;

    }

    //下载出错的情况下执行

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

    {

        [_outHandle closeFile];

     _outHandle = nil;

        NSLog(@"connection on Error:%@",error);

    }

    总结:这只是描述有关断点续传的基本实现,如果要添加进度条或者多文件队列的下载实现的话,需要进一步封装下载功能,形成一个方便使用的库。

    关于库的研究下次再讨论。

  • 相关阅读:
    Eclipse报错:An internal error has occurred. Widget is disposed
    服务器端解决跨域问题的三种方法
    为什么要使用NoSQL
    Mybatis 中$与#的区别
    maven 打包命令,跳过测试
    maven打包跳过测试命令
    Vue 扩展插件
    node 文件打开状态
    node buffer缓冲区
    npm 命令
  • 原文地址:https://www.cnblogs.com/csdnmc/p/3979597.html
Copyright © 2020-2023  润新知