定时器选择器中完成的函数

Function with Completion in Timer Selector

我这样声明一个函数:

@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 错误。如果这确实是错误,将不胜感激正确构建此选择器的一些帮助。

在调用站点应用默认参数,因此您需要生成两个单独的方法(其中一个调用另一个):

func fetchDatabase() { fetchDatabase(callback:nil) }

func fetchDatabase(callback:()->()) {
    ...
}

现在您的 scheduledTimer 调用应该可以正常工作了。

传递给计时器的选择器只允许两种可能的签名之一

  1. someFunction()
  2. someFunction(someLabel someParameter: Timer)

您无法传递 fetchDatabase(completion:) 函数,因为它与两个合法选择器签名中的任何一个都不匹配。

您需要传递一个有效的选择器,该选择器又会调用您的 fetchDatabase(completion:) 函数。例如:

@objc timerHandler() {
    fetchDatabase(completion: { (result) in
        // Stuff in here
    })
}

#selector(timerHandler) 与您的计时器一起使用。