我想在后台运行一个计时器。所以我创建了一个单身人士。
问题是在设置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")
}
}
答案 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中删除。