定时器选择器中的完成功能

时间:2018-06-01 16:07:33

标签: ios swift cocoa-touch

我正在声明一个函数:

@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错误。如果这实际上是错误,那么非常感谢正确构建此选择器的一些帮助。

2 个答案:

答案 0 :(得分:0)

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

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

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

现在,scheduledTimer来电应该可以正常使用。

答案 1 :(得分:0)

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

  1. someFunction()
  2. someFunction(someLabel someParameter: Timer)
  3. 您无法传递fetchDatabase(completion:)功能,因为它与两个合法选择器签名中的任何一个都不匹配。

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

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

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