Ios Swift:带有@escaping closure return EXC_BAD_ACCESS的选择器
我一直在做的是,我有一个函数,可以从API请求数据,当我将响应分为两个条件时,Alamofire将.success和.failure作为默认响应。我一直在使用转义闭包来检查response.success是否正确,否则我将显示一些内容,并向用户返回一个错误。在我想把它放入UIRefresh需要使用的选择器之前,它一直工作得很好 这是我的密码: 获取数据功能:Ios Swift:带有@escaping closure return EXC_BAD_ACCESS的选择器,ios,swift,exc-bad-access,uirefreshcontrol,Ios,Swift,Exc Bad Access,Uirefreshcontrol,我一直在做的是,我有一个函数,可以从API请求数据,当我将响应分为两个条件时,Alamofire将.success和.failure作为默认响应。我一直在使用转义闭包来检查response.success是否正确,否则我将显示一些内容,并向用户返回一个错误。在我想把它放入UIRefresh需要使用的选择器之前,它一直工作得很好 这是我的密码: 获取数据功能: @objc func GetData(completion: @escaping (Bool)->Void){ Alamof
@objc func GetData(completion: @escaping (Bool)->Void){
Alamofire.request("\(ConstanClass.http)/api/order?token=\(ConstanClass.token)").responseJSON { response in
switch response.result {
case .success:
if let value = response.result.value{
let json = JSON(value)
//Geting Json
completion(true)
}
case .failure(let error):
self.setErrorForm(self)
self.hud.dismiss(animated: true)
print(error)
completion(false)
}
}
}
从选择器调用:
refresher.addTarget(self, action: #selector(MyOrderController.GetData(completion:)), for: UIControlEvents.valueChanged)
以下是错误:
线程1:EXC_坏访问(代码=257,地址=0x1a1b50997c9)
这个错误指向
中的完成(true)
。为UIRefreshControl
和“值更改”事件设置的选择器必须具有非常特定的签名。请查看UIControl
文档的“目标行动机制”部分
选择器必须采用零、一或两个参数,并且这些参数只能是非常特定的参数。第一个(如果提供)必须是对控件的引用(发送方<代码>发送方代码>)。第二个(如果提供)必须是UIEvent
无法创建接受完成块的发件人。这就是坠机的原因。一个参数被视为刷新控件,但代码将其视为闭包,因此出现EXC\u BAD\u ACCESS
错误
考虑一下,如果您使用了GetData
,那么传递的完成处理程序在哪里?什么是处理完成处理程序的结果
假设没有任何东西可以处理此完成处理程序,只需更改GetData
(应命名为GetData
)即可不使用任何参数并删除完成的用法
@objc func getData(){
Alamofire.request("\(ConstanClass.http)/api/order?token=\(ConstanClass.token)").responseJSON { response in
switch response.result {
case .success:
if let value = response.result.value{
let json = JSON(value)
//Geting Json
}
case .failure(let error):
self.setErrorForm(self)
self.hud.dismiss(animated: true)
print(error)
}
}
}
并更新您的使用:
refresher.addTarget(self, action: #selector(getData), for: UIControlEvents.valueChanged)
显示如何调用此函数。也许设置完成函数的人已经不存在了…@matt实际上我想使用一个请求函数,请求api并在我启动后返回一些东西,所以我想到了闭包,我已经检查了应该向用户显示哪个响应,所以调用这个函数只是GetData{(网络)在//do nothing中,因为我们已经在函数本身内部设置了它的操作}感谢您指出我的问题!!你的答案有效