如何在Swift3中同步返回HTTP结果?

时间:2016-10-11 20:17:20

标签: http swift3

我有这个代码 - 据我所知 - 是异步的:

func testConnection() -> Bool {
    let url = URL(string: uri)!
    let task = URLSession.shared.dataTask(with: url) {
        (data, response, error) in

        guard let data = data, let _:URLResponse = response , error == nil else {
            print("error")
            return
        }

        let dataString =  String(data: data, encoding: String.Encoding.utf8)
    }

    task.resume()
}

同步版本如何看起来允许将testConnection结果返回给发件人?

1 个答案:

答案 0 :(得分:-2)

您可以使用信号量等待异步调用完成:

func testConnection() -> Bool {
    let url = URL(string: uri)!
    var dataStringOrNil: String?
    let semaphore = DispatchSemaphore(value: 0)

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        defer {
            semaphore.signal()
        }

        guard let data = data, error == nil else {
            print("error")
            return
        }

        dataStringOrNil = String(data: data, encoding: .utf8)
    }

    task.resume()
    semaphore.wait()

    guard let dataString = dataStringOrNil else {
        return false
    }

    // some substring checking
    return dataString.contains("href")
}

我不推荐它,但可能有同步通话的原因。我们有时在命令行工具中使用它们。