NSTimer scheduledTimerWithTimeInterval - 不调用funciton

时间:2016-07-16 14:00:02

标签: ios swift nstimer

我想在后台运行一个计时器。所以我创建了一个单身人士。

问题是在设置5.0秒后,它不会调用函数timeEnded()。 Xcode建议在函数前面添加@Objc(如:@Objc func timeEnded() {...)来解决一些问题(虽然我不知道)。但它仍然没有称之为该功能。有什么想法吗?

class TimerService {
    static let instance = TimerService()
    var internalTimer: NSTimer?

    func startTimer() {
        guard internalTimer != nil else {
            return print("timer already started")
        }
        internalTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: #selector(TimerService.timeEnded), userInfo: nil, repeats: false)
    }

    func timeEnded() {
        //NSNotificationCenter.defaultCenter().postNotificationName("timerEnded", object: nil)
        print("timer Ended")
    }
}

2 个答案:

答案 0 :(得分:3)

你永远不会真正启动计时器,因为你的startTimer()函数总会在到达创建计时器的代码行之前返回。

guard语句中,只有internalTimer != nil才能继续执行该功能,但在该语句之后,唯一设置计时器的位置是。因此,永远不会创建您的计时器,internalTimer始终为nil

这可以解决您的问题:

func startTimer() {
    guard internalTimer == nil else {
        return print("timer already started")
    }
    internalTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: #selector(TimerService.timeEnded), userInfo: nil, repeats: false)
}

答案 1 :(得分:2)

选择器是Objective-C的一项功能,只能与暴露于动态Obj-C运行时的方法一起使用。你不能拥有一个纯粹的Swift方法的选择器。

如果你的类继承自NSObject,那么它的公共方法会自动暴露给Obj-C。由于您的类不继承自NSObject,您必须使用@objc属性来指示您希望将此方法暴露给Obj-C,以便可以使用Obj-C选择器调用它。

#selector()是Swift 2.2中的新语法。它允许编译器检查您尝试使用的选择器是否确实存在。旧语法已弃用,将在Swift 3.0中删除。