swift - 如何将异步函数的结果返回给 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)将打印正确的数据。)
解决方案
您可以像这样创建一个回调函数,并从该函数向任何其他控制器返回响应。
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()
}
推荐阅读
- c# - 如何使用反射调用项目范围的属性?
- ios - 场景工具包渲染器上的错误访问崩溃
- linux - 如何存储“top”的输出而不是将其打印到终端?
- php - 如何在没有插件且不使用 @import 的情况下将 adobe 字体添加到 worpdress
- class - 在类中创建的模块实例如何从此类(Python 3)继承?
- scala - 尝试将 Spark DF 写入 Hive 表时出现错误“对未解析对象的限定符调用无效”
- python - 添加和规范化在熊猫中重复键的行
- python - Python Word Vect numpy 数组,保存到 csv 时出现维度错误,预期 1D 或 2D 数组,改为 0D 数组
- php - 静态属性将如何在队列中工作?
- asp.net-core - 如何使用 Azure Active Directory 在 ASP.NET Core 应用程序中获取经过身份验证的用户的名称