我准备在 Swift 3 中为 URLSession
创建一个扩展来创建同步和异步请求。这是我的实现
extension URLSession {
func sendSynchronousRequest(request: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) {
let semaphore = DispatchSemaphore(value: 0)
let task = self.dataTask(with: request) { (data, response, error) in
completionHandler(data,response,error)
semaphore.signal()
}
task.resume()
semaphore.wait(timeout: .distantFuture)
}
func sendAsynchronousRequest(request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask {
let task = self.dataTask(with: request) { data, response, error in
completionHandler(data, response, error)
}
task.resume()
return task
}
}
我让 Xcode 建议我将 @escaping 插入函数。不知道实现是否正确
我在这一行也有警告:
有人知道如何更正扩展名吗?
最佳答案
我找到了这个实现,但在 swift1/2 中不记得了。这不是我自己的。但是我用swift3重写了它。我只是不记得我是在哪里找到它的:/
func synchronousDataTaskWithURL(url: URL) -> (Data?, URLResponse?, Error?) {
var data: Data?, response: URLResponse?, error: Error?
let semaphore = DispatchSemaphore(value: 0)
dataTask(with: url) {
data = $0; response = $1; error = $2
semaphore.signal()
}.resume()
semaphore.wait()
return (data, response, error)
}
关于iOS Swift 3 为同步和异步请求创建 URLSession 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40660081/