Ios Swift:带有@escaping closure return EXC_BAD_ACCESS的选择器

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

我一直在做的是,我有一个函数,可以从API请求数据,当我将响应分为两个条件时,Alamofire将.success和.failure作为默认响应。我一直在使用转义闭包来检查response.success是否正确,否则我将显示一些内容,并向用户返回一个错误。在我想把它放入UIRefresh需要使用的选择器之前,它一直工作得很好

这是我的密码:

获取数据功能:

@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中,因为我们已经在函数本身内部设置了它的操作}感谢您指出我的问题!!你的答案有效