跳到主要内容

简单介绍下NSURLConnection类及+ sendSynchronousRequest:returningResponse:error:与– initWithRequest:delegate:两个方法的区别?

参考答案:

NSURLConnection 是 iOS 和 macOS 系统中用于处理 HTTP 请求的类。它提供了一个接口,使得开发者能够发送异步或同步的网络请求,并接收响应。在 iOS 9 及之后的版本中,NSURLSession 是推荐使用的网络请求类,但 NSURLConnection 仍然可用。

关于你提到的两个方法:

  1. + sendSynchronousRequest:returningResponse:error:

这是一个类方法,用于发送同步的网络请求。这意味着调用这个方法的线程会被阻塞,直到请求完成或发生错误。由于阻塞的特性,这个方法不应该在主线程(UI线程)上使用,否则会导致界面无响应。

这个方法的参数包括:

* 一个 `NSURLRequest` 对象,描述了要发送的请求。
* 一个 `NSURLResponse` 对象的指针,用于返回服务器的响应。
* 一个 `NSError` 对象的指针,用于返回任何发生的错误。方法返回的是一个 `NSData` 对象,包含了服务器的响应数据。
  1. - initWithRequest:delegate:

这是一个实例方法,用于初始化一个 NSURLConnection 对象,以异步方式发送网络请求。与同步请求不同,异步请求不会阻塞调用线程,使得 UI 能够保持响应。

这个方法的参数包括:

* 一个 `NSURLRequest` 对象,描述了要发送的请求。
* 一个实现了 `NSURLConnectionDelegate` 协议的代理对象。这个代理对象会接收与请求相关的各种回调,如请求开始、接收到响应数据、请求完成或发生错误等。

区别

  • 同步与异步sendSynchronousRequest:returningResponse:error: 是同步的,会阻塞线程;而 initWithRequest:delegate: 是异步的,不会阻塞线程。
  • 线程使用:同步方法不应在主线程上使用,以避免界面无响应;而异步方法通常在主线程上初始化,并通过代理回调来处理响应和错误。
  • 错误处理:同步方法通过返回 NSError 对象来处理错误;异步方法则通过代理的回调方法来处理错误和响应。
  • 灵活性:异步方法提供了更多的灵活性,因为你可以在代理方法中处理接收到的数据、重定向等,而同步方法则只能等待整个请求完成。

总的来说,由于同步方法会阻塞线程,除非有特别的需求,否则通常推荐使用异步方法来发送网络请求。