如何从完成处理程序中获取数据

时间:2018-02-07 19:53:05

标签: swift completionhandler

我正在尝试获取一个通过HTTP请求调用API并返回String的函数。我的请求函数有一个完成处理程序,它返回Data并由我的函数使用。

func buildHTML () -> String {
    var htmlString: String = ""

    request(url: "https://someurl.com/api/getalldata") { (jsonData: Data) in
        let units = try JSONDecoder().decode([MyUnits].self, from: jsonData)
            for unit in units {
                //Building my html string here
                htmlString += "......."
            }
    }
    return htmlString
}

但是这不起作用,因为htmlString作为空字符串返回,如何通过buildHTML将此字符串输出以返回它?

欢迎任何想法!

2 个答案:

答案 0 :(得分:4)

由于您的请求是异步的,因此您将无法返回结果,因为您的return语句将在执行闭包之前执行。在这种情况下,解决方案是在外部函数中使用完成处理程序:

func buildHTML(_ completion: @escaping (String)->Void) {
    var htmlString: String = ""

    request(url: "https://someurl.com/api/getalldata") { (jsonData: Data) in
        let units = try JSONDecoder().decode([MyUnits].self, from: jsonData)
            for unit in units {
                //Building my html string here
                htmlString += "......."
            }
        completion(htmlString)
    }
}

答案 1 :(得分:0)

我的解决方案将阻止当前线程,但它是同步的。您可以使用数据。

func buildHTML(_ completion: @escaping (String)->Void) {
    var htmlString: String = ""
    let url = URL(string: "https://someurl.com/api/getalldata")!

    guard let jsonData = try? Data(contentsOf: url) else {
        print("There was an error!")
        // return or break
    }

    let units = try JSONDecoder().decode([MyUnits].self, from: jsonData)
    for unit in units {
        //Building my html string here
        htmlString += "......."
    }
    completion(htmlString)
}