如何使用完成处理程序和参数调用函数
Posted
技术标签:
【中文标题】如何使用完成处理程序和参数调用函数【英文标题】:How to call function with completion handler and parameters 【发布时间】:2018-10-05 12:24:45 【问题描述】:我有一个函数 getData(completed: @escaping ()->())
,它在一个类中创建带有完成处理程序的 alamofire 请求。当 alamofire 结束它的工作时,在这个函数内部我调用completed()
来通知该函数结束了它的工作。此函数在按钮点击后在其他视图控制器中调用,但没有完成处理程序,然后在此调用中我使用下载的数据重新加载 tableview,如下所示。
现在我想向这个函数添加额外的参数,以允许用户修改 alamofire 请求的URL
,并获得自定义响应。参数将在其他文本字段中设置。但是现在当我调用downloadRepositories()
时,我不能省略调用完成参数。
如何避免在其中调用完成处理程序或其他什么 我应该实现完成处理程序吗?
当前的 alamofire 请求
class DataClass
func getData(completed: @escaping () -> ())
//alamofire request
Alamofire.request(url).responseJSON
//reponse
completed()
它的实现
class OtherVC
var dataClass = DataClass()
@objc func searchBtnTapped(sender: UIButton!)
dataclass.getData()
self.TableView.reloadData()
我想做的事
class DataClass
func downloadRepositories(completed: @escaping () -> (), parameter1: String, parameter2: String)
let parameters: Parameters = [ "parameterA": parameter, "parameterB": parameter2 ]
Alamofire.request(url, parameters: parameters).responseJSON
//response
completed()
修改后func的实现
class OtherVC
var dataClass = DataClass()
@objc func searchBtnTapped(sender: UIButton!)
dataclass.getData(parameter1: someTextField.text, parameter2: someTextField2.text)
self.TableView.reloadData()
我当然知道这样在 func 调用中传递参数是不可能的,但是怎么能这样呢?
【问题讨论】:
【参考方案1】:这样使用:
func downloadRepositories(parameter1: String, parameter2: String, completed: @escaping () -> ())
let parameters: Parameters = [ "parameterA": parameter, "parameterB": parameter2 ]
Alamofire.request(url, parameters: parameters).responseJSON
//response
completed()
【讨论】:
如何在这个函数中传递一个json数组? 你说的json数组是什么意思?【参考方案2】:你在正确的轨道上) 如果你想这样调用 func:
dataclass.getData(parameter1: someTextField.text, parameter2: someTextField2.text)
self.TableView.reloadData()
您只需要像这样更改参数顺序:
func downloadRepositories(parameter1: String, parameter2: String, completed: @escaping () -> ())
如果我理解正确并且你想使用Trailing Closures,那么就是这样
【讨论】:
以上是关于如何使用完成处理程序和参数调用函数的主要内容,如果未能解决你的问题,请参考以下文章