我正在声明一个函数:
@objc func fetchDatabase(completion: ((Bool) -> Void)? = nil)
我允许完成nil
,因此我可以将其称为fetchDatabase()
或
fetchDatabase(completion: { (result) in
// Stuff in here
})
但是,我也尝试在#selector
Timer
中使用此功能。我使用以下行创建此计时器:
Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(fetchDatabase), userInfo: nil, repeats: true)
没有完成,这运行正常。但是,添加完成后,每当计时器运行时,我都会收到EXC_BAD_ACCESS
错误。如果这实际上是错误,那么非常感谢正确构建此选择器的一些帮助。
答案 0 :(得分:0)
默认参数在调用站点应用,因此您需要生成两个单独的方法(其中一个调用另一个):
func fetchDatabase() { fetchDatabase(callback:nil) }
func fetchDatabase(callback:()->()) {
...
}
现在,scheduledTimer
来电应该可以正常使用。
答案 1 :(得分:0)
传递给计时器的选择器只允许两种可能的签名之一
someFunction()
someFunction(someLabel someParameter: Timer)
您无法传递fetchDatabase(completion:)
功能,因为它与两个合法选择器签名中的任何一个都不匹配。
您需要传递一个有效的选择器,该选择器会调用您的fetchDatabase(completion:)
功能。例如:
@objc timerHandler() {
fetchDatabase(completion: { (result) in
// Stuff in here
})
}
将#selector(timerHandler)
与您的计时器一起使用。