如何使用 URLSession 在异步 api 调用中查找哪个响应属于哪个请求
How to Find which response belongs to which request in Async api calling using URLSession
我正在使用 URLSession
从我的 iPhone 应用中的 API's
获取响应。在我的例子中,我使用异步 API 调用一次遇到大约 10 个相同 api 的请求,并且我得到了所有请求的响应。现在如何从这些响应中找到哪个响应属于哪个请求?任何帮助表示赞赏。
你有很多方法可以做到这一点。
1 - 基本上,如果您使用标识符调用客户端函数,您将能够在完成块中检索它:
func call(with identifier: String, at url: URL) {
URLSession.shared.dataTask(url: url) { (_, _, _) in
print(identifier)
}.resume()
}
2 - 您还可以使用 URLSessionDataTask
的任务标识符。但是要做到这一点,您需要使用自定义 URLSession
:
的委托
self.session = URLSession(configuration: URLSessionConfiguration.default,
delegate: self,
delegateQueue: nil)
那么你将不会使用完成块,而是使用委托函数:
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
print(dataTask.taskIdentifier)
}
(当然你需要知道哪个任务标识符被设置为URLSessionDataTask
)
3 - 如果您需要从您的完成块访问您的标识符,您可以编写一个函数,它将在默认完成块的参数列表中发生:
func dataTask(session: URLSession,
url: URL,
identifier: String,
completionBlock: @escaping (String, Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask {
return session.dataTask(with: url) { (data, response, error) in
completionBlock(identifier, data, response, error)
}
}
4 - 如果您需要在 URLSessionDataTask
对象中使用自定义标识符,您可以使用扩展名和关联对象添加它:
extension URLSessionDataTask {
var identifier: String? {
get {
let identifier = objc_getAssociatedObject(self, &kIdentiferId)
if let id = identifier as? String {
return id
} else {
return nil
}
}
set {
objc_setAssociatedObject(self, &kIdentiferId, newValue, .OBJC_ASSOCIATION_RETAIN)
}
}
}
private var kIdentiferId: Int8 = 100
那么你可以这样使用它:
let task = session.dataTask(url: url)
task.identifier = "hello"
我正在使用 URLSession
从我的 iPhone 应用中的 API's
获取响应。在我的例子中,我使用异步 API 调用一次遇到大约 10 个相同 api 的请求,并且我得到了所有请求的响应。现在如何从这些响应中找到哪个响应属于哪个请求?任何帮助表示赞赏。
你有很多方法可以做到这一点。
1 - 基本上,如果您使用标识符调用客户端函数,您将能够在完成块中检索它:
func call(with identifier: String, at url: URL) {
URLSession.shared.dataTask(url: url) { (_, _, _) in
print(identifier)
}.resume()
}
2 - 您还可以使用 URLSessionDataTask
的任务标识符。但是要做到这一点,您需要使用自定义 URLSession
:
self.session = URLSession(configuration: URLSessionConfiguration.default,
delegate: self,
delegateQueue: nil)
那么你将不会使用完成块,而是使用委托函数:
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
print(dataTask.taskIdentifier)
}
(当然你需要知道哪个任务标识符被设置为URLSessionDataTask
)
3 - 如果您需要从您的完成块访问您的标识符,您可以编写一个函数,它将在默认完成块的参数列表中发生:
func dataTask(session: URLSession,
url: URL,
identifier: String,
completionBlock: @escaping (String, Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask {
return session.dataTask(with: url) { (data, response, error) in
completionBlock(identifier, data, response, error)
}
}
4 - 如果您需要在 URLSessionDataTask
对象中使用自定义标识符,您可以使用扩展名和关联对象添加它:
extension URLSessionDataTask {
var identifier: String? {
get {
let identifier = objc_getAssociatedObject(self, &kIdentiferId)
if let id = identifier as? String {
return id
} else {
return nil
}
}
set {
objc_setAssociatedObject(self, &kIdentiferId, newValue, .OBJC_ASSOCIATION_RETAIN)
}
}
}
private var kIdentiferId: Int8 = 100
那么你可以这样使用它:
let task = session.dataTask(url: url)
task.identifier = "hello"