###目的: 了解iOS如何进行网络请求1
首先,你得知道HTTP之前的通信过程是怎么样的,具体参考我之前写过的文章。
URL Loading System
Interact with URLs and communicate with servers using standard Internet protocols.
URLSession
使用标准Internet协议与url交互并与服务器通信。
简述:
URL加载系统使用标准协议(如https或您创建的自定义协议)提供对URL标识的资源的访问。加载是异步执行的,因此您的应用程序可以保持响应性,并在传入数据或错误到达时处理它们。
您可以使用一个URLSession实例来创建一个或多个URLSessionTask实例,该实例可以将数据获取并返回到您的应用程序、下载文件或将数据和文件上载到远程位置。要配置会话,可以使用URLSessionConfiguration对象,该对象控制诸如如何使用缓存和cookie或是否允许在蜂窝网络上连接等行为。
您可以重复使用一个会话来创建任务。例如,web浏览器可能有用于常规浏览和私有浏览的单独会话,其中私有会话不缓存其数据。图1显示了使用这些配置的两个会话如何创建多个任务。
每个会话都与一个委托相关联,以接收定期更新(或错误)。默认委托调用您提供的完成处理程序块;如果您选择提供自己的自定义委托,则不会调用此块。1
这里就说到,如果你使用代理来接受数据,那么block就不会执行。二者只能选择其中一个(URLSession执行task时,关于数据传输的两只方式)。
You can configure a session to run in the background, so that while the app is suspended, the system can download data on its behalf and wake up the app to deliver the results.
Fetching Website Data into Memory
通过从URL会话创建数据任务,直接将数据接收到内存中。
Receive Results with a Completion Handler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22func startLoad() {
let url = URL(string: "https://www.example.com/")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
self.handleClientError(error)
return
}
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
self.handleServerError(response)
return
}
if let mimeType = httpResponse.mimeType, mimeType == "text/html",
let data = data,
let string = String(data: data, encoding: .utf8) {
DispatchQueue.main.async {
self.webView.loadHTMLString(string, baseURL: url)
}
}
}
task.resume()
}
Receive Transfer Details and Results with a Delegate
在创建数据任务时,您可以在会话上设置委托,而不是提供完成处理程序,以便在任务进行时对任务的活动进行更大程度的访问。
1 | private lazy var session: URLSession = { |