Swift中数据任务完成处理程序的附加参数
我是Swift的新手。当按下按钮时,我的视图控制器调用Web服务类的方法。反过来方法调用dataTask(),并提供了一个完成处理程序:Swift中数据任务完成处理程序的附加参数
let task = session.dataTask(with: request as URLRequest) { data, response, error in
guard error == nil && data != nil else {
print(error ?? "")
return
}
// print(JSON(data:data!))
print ("data : ", data ?? "-- no data --")
print ("response : ", response ?? "-- no response --")
print ("error : ", error ?? "-- no error --")
完成处理程序需要更新视图控制器的GUI。但是,处理程序似乎只采用三个标准参数。如何将视图控制器参考传递给它?处理程序无法执行self.someTextView.update(.....)来更新GUI,因为它位于Web服务类中,而不是视图控制器中。
有什么想法?谢谢。
您可以发布一个本地通知,它会触发一个方法,并在UIViewController类中声明该方法。
这里是代码:
在Web服务类:在完成处理程序:
NotificationCenter.default.post(名称: Notification.Name( “Notification_NAME_HERE”),对象:无, USERINFO: 无)
在UIViewController类:在viewDidLoad中:
NotificationCenter.default.addObserver(个体,选择器: #selector(notificationHandler(通知:)),名称:Notification.Name(Notification_NAME_HERE),对象:无)
添加用notificationHandler方法进入的UIViewController类:
FUNC notificationHandler(通知:通知) {这里 //更新UI }
完成处理程序将触发此方法,同时您可以更新您的UI或任何想要在UIViewController类中执行的操作。
我认为这会对你有所帮助。
按照在dataTask(with:completionHandler:)提到:
此完成处理程序采用以下参数:
data
由服务器返回的数据。
response
提供响应元数据(例如HTTP标头和 状态码)的对象。如果您正在发出HTTP或HTTPS请求,则返回的 对象实际上是一个HTTPURLResponse对象。
error
错误对象,指示请求失败的原因,或者零如果 请求成功。
这意味着 - 显然 - 它与UIViewController无关。因此,如果你想将“ViewController”图层包含到这样一个过程中,你可以实现你自己的包装来完成这样一个任务,例如,你可以创建一个接受完成参数的函数 - 作为一个逃脱closure-如下:
func request(completion: @escaping() ->()) {
let task = session.dataTask(with: request as URLRequest) { data, response, error in
guard error == nil && data != nil else {
print(error ?? "")
return
}
// print(JSON(data:data!))
print ("data : ", data ?? "-- no data --")
print ("response : ", response ?? "-- no response --")
print ("error : ", error ?? "-- no error --")
// now you could call the "completion" parameter:
completion()
}
}
在您的视图控制器,你可以把它作为:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
request {
// now you could update your textview:
self.someTextView.update(.....)
}
}
}
你可以申报request
签名,以满足您的需求...
不知道这件事,但关于使用捕捉值是什么? 喜欢的东西...
...code...
var somevar = 3
....whateverblock { [unowned somevar], (default parameters of the blcok) in
somevar = 4
...code...
}
我没有测试这一点,所以不知道是否会工作。
添加一些代码,请,我不知道你把任务 –
封闭捕获从调用方法的对象和值,所以使用'self'或者创建拥有你之前'让任务所需要的参考变量。 ..' – vadian
假设您的视图控制器具有此Web服务类的引用,使委托或它们之间的回调函数。 – sCha