天天看点

NSURLConnection 网络请求

前言

DEPRECATED: The NSURLConnection class should no longer be used.

NSURLSession is the replacement for NSURLConnection

从 iOS 9 开始 NSURLConnection 的大部分方法被废弃。

1、NSURLConnection

NSURLConnection 提供了两种方式来实现连接,一种是同步的另一种是异步的,异步的连接将会创建一个新的线程,

这个线程将会来负责下载的动作。而对于同步连接,在下载连接和处理通讯时,则会阻塞当前调用线程。

许多开发者都会认为同步的连接将会堵塞主线程,其实这种观点是错误的。一个同步的连接是会阻塞调用它的线程。

如果你在主线程中创建一个同步连接,没错,主线程会阻塞。但是如果你并不是从主线程开启的一个同步的连接,它将会类似异步的连接一样。

因此这种情况并不会堵塞你的主线程。事实上,同步和异步的主要区别就是运行 runtime 为会异步连接创建一个线程,而同步连接则不会。

1、NSURL:请求地址;

2、NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个 NSURL 对象,请求方法、请求头、请求体 ....;

3、NSMutableURLRequest:NSURLRequest 的子类

4、NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送 NSURLRequest 的数据给服务器,并收集来自服务器的响应数据。

1、创建一个 NSURL 对象,设置请求路径(设置请求路径);

2、传入 NSURL 创建一个 NSURLRequest 对象,设置请求头和请求体(创建请求对象);任何 NSURLRequest 默认都是 GET 请求。

3、使用 NSURLConnection 发送 NSURLRequest(发送请求)。

发送同步请求:有返回值。

发送异步请求:没有返回值。

使用 NSURLConnection 的 sendSynchronousRequest:returningResponse:error: 类方法,我们可以进行同步请求。

在创建一个同步的网络连接的时候我们需要明白一点,并不是是我们的这个同步连接一定会堵塞我们的主线程,如果这个同步的连接是创建在主线程上的,

那么这种情况下是会堵塞我们的主线程的,其他的情况下是不一定会堵塞我们的主线程的。

例如如果在 GCD 的全局并发队列上初始化了一个同步的连接,其实并不会堵塞我们的主线程的。

发送异步请求有两种方式:

创建一个操作,放在 NSOperation 队列中执行,默认是异步执行的。当服务器有返回数据的时候调用会开一条新的线程去发送请求,主线程继续往下走,

当拿到服务器的返回数据的数据的时候再回调 block,执行 block 代码段。这种情况不会卡住主线程。

queue 队列的作用是决定这个 block 操作放在哪个线程执行?刷新 UI 界面的操作应该放在主线程执行,不能放在子线程,在子线程处理 UI 相关操作

会出现一些莫名的问题。使用 [NSOperationQueue mainQueue] 返回一个和主线程相关的队列,即主队列,这个 block 操作会被放在主线程中执行。使用

[[NSOperationQueue alloc] init] 返回的不是主队列,这个 block 操作不会被放在主线程中执行。

要监听服务器返回的 data,所以使用 协议。

当接收到服务器的响应(连通了服务器)时会调用:

当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据,需要拼接接收到的所有数):

当服务器的数据加载完毕时就会调用:

请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误):

NSURLConnection 的代理方法默认都是在主线程上执行的,会对界面产生卡顿。

For the connection to work correctly, the calling thread’s run loop must be operating in the default run loop mode.

为了让连接工作正常,调用线程的运行循环必须在默认的运行循环模式下。

如果要让 NSURLConnection 实现在后台线程回调代理方法,需要在后台线程启动 NSURLConnection,并启动后台线程的运行循环,NSURLConnection

执行完毕后,会自动停止后台线程的运行循环。

启动子线程的运行循环方法:

创建网络连接后可以不使用 start,系统会自动开始网络连接。

取消一个请求后,连接不在调用代理方法,如果希望再此连接,需要再次创建一个新的网络连接。

NSURLConnectionDownloadDelegate 代理方法是为 Newsstand Kit’s(杂志包) 创建的下载服务的,Newsstand 主要在国外使用比较广泛,国内极少。

如果使用 NSURLConnectionDownloadDelegate 代理方法监听下载进度,能够监听到进度,但是找不到下载的文件。

2、NSURLConnection 同步 GET 请求

3、NSURLConnection 同步 POST 请求

4、NSURLConnection 异步 GET 请求

5、NSURLConnection 异步 POST 请求

6、NSURLConnection 文件下载

7、NSURLConnection 下载单例封装

作者: CH520

下一篇: 网络请求