文档章节

ios NSURLSession简介

不要青椒炒肉
 不要青椒炒肉
发布于 2014/08/30 21:10
字数 1102
阅读 2483
收藏 2

iOS7 中我们可以使用NSURLSession类来进行URL请求。如果是更早之前的版本使用NSURLConnection,在此之前先看下ios中关于URL的一些相关类。

URLLoading部分是我们主要使用的类,其它五个是帮助类。涉及各个方面。协议支持,加密,cookie管理,缓存,配置。

NSURLSession中的任务的行为依赖于三件事:session的类型(由传入的configuration对象来决定),task的类型,当task创建时应用是否处于前台。

Session的类型

1. 默认session使用diskcache并将证书保存在用户keychain中。

2. 短暂session没有将任何数据存在disk上,所有相关的东西都在ram中,当session无效时,这些内容自动被清除。

3.后台session,和默认session类似,除了独立一个进程来处理所有的数据传送。还有些限制。


Task的类型

在一个session中,NSURLSession支持三种任务类型:data tasks, download tasks, upload tasks

data task: 使用NSData来发送和接收数据,适用于频繁的,数据量很小的交互。可以在数据到达时将数据发送给应用,或是在数据接收完成时,回调。

download task:以文件的形式接收数据。并且当app没有运行时,支持后台下载。

upload task:发送数据(通常以文件的形式)。并且当app没有运行时,支持后台上传。


创建并配置一个session

NSURLSession提供了很多的配置选项:

指明存储cache, cookies, credentials的位置

auth,和一个特殊的request(task)关联,或是一组的request(session)

文件的上传和下载,从metadata 中分离。

每个host的最大连接数。

每个resource的超时时间,

最小和最大的TLS版本支持

自定义proxy 字典

控制cookie 策略

控制http pipelining行为

因为大部分设置都包含在独立的配置对象中,你可以重新使用配置。当你实例化一个session object时,你指明了:

一个配置对象来管理session和task的行为。

可选的,一个委托对象来处理incoming data 当接收到数据时并处理session和task的其它事件。例如服务端鉴权,决定i一个resource load是否被转化成download,等等。

如果你没有提供一个委托,NSURLSession使用系统提供的。在这种情况下,你可以欣然的使用NSURLSession的 sendAsynchronousRequest:queue:completionHandler: 方法。

注意:如果你的app需要执行后台传输,就必须提供一个自定义的委托。

在你实例化seesion对象后,你不能改变配置或者委托在没有创建新的session情况下。

下面来看下如何创建normal, ephemeral和background sessions.

self.completionHandlerDictionary = [NSMutableDictionary dictionaryWithCapacity:0];

NSURLSessionConfiguration *backgroundConfigObject = [NSURLSessionConfiguration backgroundSessionConfiguration: @"myBackgroundSessionIdentifier"];

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];

NSURLSessionConfiguration *ephemeralConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];

NSURLCache *myCache = [[NSURLCache alloc] initWithMemoryCapacity: 16384 diskCapacity: 268435456 diskPath: cachePath];

defaultConfigObject.URLCache = myCache;

defaultConfigObject.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;

self.defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];

self.backgroundSession = [NSURLSession sessionWithConfiguration: backgroundConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];

self.ephemeralSession = [NSURLSession sessionWithConfiguration: ephemeralConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];

除了background configuration,可以重新使用session configuraion对象来创建其它的session.

因为它是深拷贝的。

使用系统提供的委托来获取资源

最直接的方式是调用NSURLSession的sendAsynchronousRequest:queue:completionHandler: 方法。使用这个方法你只需要提供两段代码。

创建configuration object 和session

一个completion handler来处理当数据完全的接收到之后。

使用系统提供的委托,你只需要一行代码来获取一个指定的URL。

NSURLSession *delegateFreeSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];


[[delegateFreeSession dataTaskWithURL: [NSURL URLWithString: @"http://www.example.com/"]

completionHandler:^(NSData *data, NSURLResponse *response,

NSError *error) {
NSLog(@"Got response %@ with error %@.\n", response, error);
NSLog(@"DATA:\n%@\nEND DATA\n",
[[NSString alloc] initWithData: data
encoding: NSUTF8StringEncoding]);
}] resume];


注意:

系统提供的委托提供了有限的自定义网络行为。如果你的应用需要鉴权或后台下载等功能,系统委托就不适用了,如何实现一个完整的委托,请看:“Life Cycle of a URL Session.”

使用自定义委托来获取数据

如果使用自定义委托来获取数据,必须实现以下两个方法:

URLSession:dataTask:didReceiveData: 一次接收一片的数据。

URLSession:task:didCompleteWithError:指明数据已经完全接收到了。

如果应用想在URLSession:dataTask:didReceiveData:返回后使用数据,代码必须将数据进行保存处理

data task example

NSURL *url = [NSURL URLWithString: @"http://www.example.com/"];
NSURLSessionDataTask *dataTask = [self.defaultSession dataTaskWithURL: url];
[dataTask resume];




© 著作权归作者所有

不要青椒炒肉
粉丝 0
博文 1
码字总数 1102
作品 0
福州
私信 提问
iOS基础深入补完计划--NSURLSession使用详解(附Demo)

目录 前言 API Demo 前言 本文主要是把NSURLSession以及NSURLSessionTask相关的代理方法全部整理了一下。 旨在大体了解在一个iOS网络请求中、一个任务究竟经理了什么。 而我们、又能做些什么...

kirito_song
2018/05/10
0
0
AFNetworking 2.0 发布,iOS 网络框架

AFNetworking 是一款在 iOS 开发中广泛使用的网络框架,其刚刚发布最新的 2.0 版本,主要改进: 架构重构 支持 NSURLSession Serialization Modules Expanded UIKit Extensions Real-time f...

oschina
2013/09/28
9K
5
iOS源码补完计划--AFNetworking 3.1.0源码研读

参拜一下AFNetworking的源码。 第四篇源码、暂时来看也是iOS方向的最后一篇、撸完准备趁着热乎撸一撸网络协议。 目录 准备工作 功能模块 AFURLSessionManager/AFHTTPSessionManager AFNetwo...

kirito_song
2018/05/25
0
0
iOS 仿看了吗应用、指南针测网速等常用工具、自定义弹出视图框架、图片裁剪、内容扩展等源码

iOS精选源码 扩展内容的cell - folding-cell(http://www.code4app.com/thread-12652-1-1.html) 一个近乎完整的可识别中国身份证信息的Demo 可自动快速...(http://www.code4app.com/thread-12...

Android爱开源
2018/10/31
18
0
AFNetworking是一个为 iOS 和 Mac OSX 制作的令人愉快的网络库

AFNetworking是一个为 iOS 和 Mac OSX 制作的令人愉快的网络库,它建立在URL 装载系统框架的顶层,内置在Cocoa里,扩展了强有力的高级网络抽象。它的模块架构被良好的设计,拥有丰富的功能,...

lewis-180
2015/04/02
272
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.1K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部