iOS Swift 3 为同步和异步请求创建 URLSession 扩展

标签 ios swift nsurlsession

我准备在 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 插入函数。不知道实现是否正确

我在这一行也有警告:

enter image description here

有人知道如何更正扩展名吗?

最佳答案

我找到了这个实现,但在 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/

相关文章:

ios - 加密 NSURLCache 的更好方法是什么?

ios - 如何摆脱等待完成处理程序

ios - UIWebView 弹跳回调

ios - 如何停止具有相同主次的 iBeacon 检测?

swift - Swift 中 println 和 print 的区别

ios - 使用 NSURLSession 将 NSString 作为 post 方法的主体发送

ios - 后台音频在iOS模拟器上运行,但在设备上不运行

ios - 如何更改表格行的高度以适合 UILabel

ios - 如何使用UIStackview实现这个 View ?

swift - 有什么安全方法可以阻止用户每次打开我的应用程序时都必须使用 Twitter Digits 登录?