首页 > 解决方案 > 如何将异步函数的结果返回给 Swift 中的不同类

问题描述

我正在努力通过在 Swift 中抓取来检索一些数据,并且在我的项目中的类之间传递数据时遇到了麻烦。

现在这些函数成功地抓取了数据并将其打印到控制台,但我无法将数据返回给 ViewController 类。

这是视图控制器

    @IBAction func tester(sender: UIButton) {       
        var xx = "DON'T PRINT THIS"

        xx = grabTheDeetz()

        print(xx)
    }

这里是grabTheDeetz()。我希望将数据返回给 ViewController。

    print("starting")
    var x = ""
    rip(onSuccess: {
        data in
        print(data)
    })
    return x
//////////////////////////////
        let task = URLSession.shared.dataTask(with: request) {(data, response, error) in

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

            guard let htmlString = String(data: data, encoding: .shiftJIS) else {
                print("couldn't cast data into String")
                return
            }

            //print(htmlString)
            success(htmlString)

        }

        task.resume()

我知道数据已成功检索,我只是想将其恢复到可以正确处理的正确位置。

ViewController 中的函数在返回数据之前运行。(在这种情况下,按下按钮“不要打印”将始终打印,打印(htmlString)将打印正确的数据。)

标签: swiftxcodeasynchronous

解决方案


您可以像这样创建一个回调函数,并从该函数向任何其他控制器返回响应。

private func process(using request:URLRequest, closure:@escaping (Error?, Any?) -> ()) {
    let urlSessionTask = URLSession.shared.dataTask(with:request, completionHandler: { (data, response, error) in
        var responseData:Any?
        var errorResponse:Error?

        closure(errorResponse, responseData)
    })
    urlSessionTask.resume()
}

推荐阅读