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

iOS Swift 3 create URLSession extension for synchronous and asynchronous request

我将在Swift 3中为URLSession创建扩展以创建同步和异步请求。 这是我的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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中不记得了。 这不是我自己的。 但是我很快改写了它。 我只是不记得我在哪里找到的:/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)
}