Swift中数据任务完成处理程序的附加参数

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服务类中,而不是视图控制器中。

有什么想法?谢谢。

+0

添加一些代码,请,我不知道你把任务 –

+0

封闭捕获从调用方法的对象和值,所以使用'self'或者创建拥有你之前'让任务所需要的参考变量。 ..' – vadian

+0

假设您的视图控制器具有此Web服务类的引用,使委托或它们之间的回调函数。 – sCha

您可以发布一个本地通知,它会触发一个方法,并在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... 
} 

我没有测试这一点,所以不知道是否会工作。