简单介绍下NSURLConnection类及+ sendSynchronousRequest:returningResponse:error:与– initWithRequest:delegate:两个方法的区别?
参考答案:
NSURLConnection
是 iOS 和 macOS 系统中用于处理 HTTP 请求的类。它提供了一个接口,使得开发者能够发送异步或同步的网络请求,并接收响应。在 iOS 9 及之后的版本中,NSURLSession
是推荐使用的网络请求类,但 NSURLConnection
仍然可用。
关于你提到的两个方法:
- + sendSynchronousRequest:returningResponse:error:
这是一个类方法,用于发送同步的网络请求。这意味着调用这个方法的线程会被阻塞,直到请求完成或发生错误。由于阻塞的特性,这个方法不应该在主线程(UI线程)上使用,否则会导致界面无响应。
这个方法的参数包括:
* 一个 `NSURLRequest` 对象,描述了要发送的请求。
* 一个 `NSURLResponse` 对象的指针,用于返回服务器的响应。
* 一个 `NSError` 对象的指针,用于返回任何发生的错误。方法返回的是一个 `NSData` 对象,包含了服务器的响应数据。
- - initWithRequest:delegate:
这是一个实例方法,用于初始化一个 NSURLConnection
对象,以异步方式发送网络请求。与同步请求不同,异步请求不会阻塞调用线程,使得 UI 能够保持响应。
这个方法的参数包括:
* 一个 `NSURLRequest` 对象,描述了要发送的请求。
* 一个实现了 `NSURLConnectionDelegate` 协议的代理对象。这个代理对象会接收与请求相关的各种回调,如请求开始、接收到响应数据、请求完成或发生错误等。
区别:
- 同步与异步:
sendSynchronousRequest:returningResponse:error:
是同步的,会阻塞线程;而initWithRequest:delegate:
是异步的,不会阻塞线程。 - 线程使用:同步方法不应在主线程上使用,以避免界面无响应;而异步方法通常在主线程上初始化,并通过代理回调来处理响应和错误。
- 错误处理:同步方法通过返回
NSError
对象来处理错误;异步方法则通过代理的回调方法来处理错误和响应。 - 灵活性:异步方法提供了更多的灵活性,因为你可以在代理方法中处理接收到的数据、重定向等,而同步方法则只能等待整个请求完成。
总的来说,由于同步方法会阻塞线程,除非有特别的需求,否则通常推荐使用异步方法来发送网络请求。