• NSURLSession总结


    NSURLSession(会话)(ios7新增加)

    //英译  Session:会议,讲话 configuration:结构,配置 expect:预期 resume:取得 suspend:推迟 progress:进展 submit:提交 allow:允许 present:呈现

    NSURLSessionTask(任务父类不能直接使用)

    NSURLSessionDataTask:用于JSON XML HTML 的GET,POST请求

    NSURLSessionDownloadTask:处理文件下载的任务,可以通过代理方式监听下载进度,可以通过是指会话的配置,允许后台下载

    NSURLSessionConfiguration:会话三种配置,默认,临时,后台;大部分时候用单例模式即可,使用后台运行才用这个..

    NSURLSessionUploadTask:继承NSURLSessionDataTask

    处理

    //服务器返回数据是少量多次的,不是一次性全部返回,有三个任务,一个数据任务,一个下载任务,一个上传任务,使用NSURLSession所有的网络访问都是有缓存的,缓存文件会默认保存到沙盒的tmp文件夹中,并且删除它,它是线程安全的,无需考虑加锁之类

    发送请求,接收体积较大的文件

    //用NSURLConnection 发送请求获得数据,当数据较大时,程序会直接闪退,或崩溃,所以成就了AFN框架(AFN的线程安全并不好)

    由于AFN的线程安全并不好,所以在所下载时,用进度条监听进度时候,有时候会超过100%.

    iphone4内存:512M IPAD1: 256M

    //所以downLoadTask是直接和临时文件打交道,不是和内存数据打交道,能节约内存空间的占用

    //沙盒---问题

    NSString *document= NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES)[0] ;

    NSString *path= [document stringByAppendingPathComponent:@"123.mp4"];

    NSURL *pathUrl=[NSURL fileURLWithPath:path];

    直接写进document文件中

    @"NSURLSession应用

      //发送GET请求(dataTask)/NSURLConnection

    实现-封装请求

    --NSURLSession单例->对象调用dataTask,参数为request返回值为数据任务,块代码会返回data,response,error,可以使用data了->任务调用resume(开启任务)

      //发送POST请求(dataTask)/NSURLConnection

    实现-封装请求,指定请求类型,数据体(URL路径异于GET路径)

    剩下的与GET一样

      //发送Download请求(dawnloadTask)

    封装URL(需要转码)

    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    路径字符串->转码->封装成URL

    实例化单例Session->对象调用downloadtask,参数URLD的返回值为下载任务,块代码返回的有location(本地保存下载文件路径)response(相应)error->任务调用resume(开启任务)

    缓存文件会默认保存到沙盒的tmp文件夹中,复制到沙盒文件夹

    拿到下载文件的名字类型->作为写进沙盒文件的路径名字(建沙盒路径,用新名字拼串component )

    ///怎么将一个文件的内容copy到另一个文件

    将文件路径转为URL用 fileURLWithPath

    创建文件管理者->调用copy方法 URL ToURL

       //发送Download[断点续传]请求

    实例化队列,实现代理,创建URL,给控制器添加协议

    会话匹配有三种类型:

    NSURLSessionConfiguration:会话三种配置,默认,临时,后台;大部分时候用单例模式即可,使用后台运行才用这个..

    类方法带会话配置(configuration)代理,队列,为参数来实例化Session->对象方法调用downloadTask(参数只有URL)->任务开启

    实现三个代理方法

    第一个:下载完成,带参数location,可以拿到下载文件

    第二个:

    第三个:下载进度跟踪,三个返回参数bytesWritten(当前下载) totalBytesWritten(已经下载) totalBytesExpectedToWrite(总长度)

    这里可以弄个进度条做个更新(且!放在主线程中作更新)

       //做上传UPload(PUT类型)

    封装request,由于是put请求需指定保存文件的文件名

    将上传信息转为Data类型

    实例化单例对象Session->对象调用uploadTask参数request,上传Data数据,块代码返回参数data(上传成功的提示信息),response,error->任务开启

    //做暂停的具体实现

    - (IBAction)pauseResume:(UIButton *)sender

    {

        sender.tag=!sender.tag;

        if (sender.tag){

            [_downLoadTask suspend];

        }else{

            [_downLoadTask resume];

        }

        

    }

    //从图片库里上传图片到服务器

    picker.sourceType =UIImagePickerControllerSourceTypePhotoLibrary;

    实例化UIImagePickerController对象(正常init)->设置对象(包括来源,可编译,设置代理)->显示视图[self present]

    实现代理方法

    UIImage *image = info[UIImagePickerControllerEditedImage];

    取出照片->设置照片->调用上传方法->关闭照片选择器[self dismiss]

    //上传文件

    //正常网页 用户->UPload.html(准备上传文件,指定文件名)->UPload.php(将用户选择的文件上传到服务器预设好的位置)

    //AFN(IOS) 用户将要上传的文件转变成二进制数据并且指定上传后的文件名

    //NSURLSession 用户直接上传文件到服务器的预设好的文件 put

    //从照片库里选择图片

    //关于多线程

    初衷:解决在一个CPU上实现并发的技术(队列是调度任务的)

  • 相关阅读:
    IOS8 设置TableView Separatorinset 分割线从边框顶端开始
    文件目录的访问
    The file “XXX” couldn’t be opened because you don’t have permission to view it.解决方法:
    NSString 的常见方法
    如何在一个工作站里创建多个工程(同一个xcode下面创建多个工程)
    自定义NSLog
    内存恶鬼drawRect
    URL编码解码
    怎样在UICollectionView中添加Header和footer
    本人开始玩微信公众号了!名称:BHS编程技术交流分享,只发干货,不发水文,欢迎阅读
  • 原文地址:https://www.cnblogs.com/ly1973/p/5394441.html
Copyright © 2020-2023  润新知