如果我们在使用NSURLSession类时并没有提供代理对象,系统提供的代理对象会仔细地处理我们的事务。当我们以系统提供的代理对象来使用NSURLSession时,若我们应用程序接收到了相关数据,我们需要调用completionHandler处理方法,具体的调用顺序如下:

  1. 创建一个session的配置对象。如果是后台session(background session),则需要给配置对象分配一个唯一标识符,保存该标识符并在程序发生了carsh、终止或者暂停之后重新关联session。
  2. 创建一个session,指定配置对象并且把代理对象设置为nil
  3. 创建一个task(任务,在session里面,一个任务对应一个请求); 每个任务在开始的时候都是处于暂停状态,在我们手动对任务调用resume方法之后便开始下载指定的资源。这些任务对象都是NSURLSessionTask子类(包括有NSURLSessionDataTask, NSURLSessionUploadTask, 和NSURLSessionDownloadTask)的实例,具体是哪一个类的实例取决于自己的实现。尽管可以给一个session添加多个task,但为了简单起见,下面步骤讨论的都是基于单个任务的场景。若在使用NSURLSession类时没有提供代理,我们需要在创建任务时传入completionHandler参数,否则将无法从类中获取数据。
  4. 对于下载任务,在和服务器数据传输期间,如果用户告诉我们他需要暂停下载,在程序中可以调用cancelByProducingResumeData:方法来取消任务。然后在某个时刻把返回的resumeData传递给downloadTaskWithResumeData:或者downloadTaskWithResumeData:completionHandler:方法去创建一个新的下载任务,让这个新的下载任务来继续完成之前任务的下载操作。
  5. 当任务完成,NSURLSession对象会调用任务的completionHandler。
  6. 如果我们app不再需要session之后,调用invalidateAndCancel(取消任务)或者finishTasksAndInvalidate(在废弃对象之前完成任务)废弃它。

✨✨✨ 提示

NSURLSession不会通过error参数来报告服务器错误,仅仅只接收客户端错误,例如无法解析主机名或者无法连接到对应主机。错误码在URL Loading System Error Codes中有提到。

服务端的错误通过NSHTTPURLResponse对象的HTTP状态码来获悉。

results matching ""

    No results matching ""