使用定时器会出奇怪的错误,那么你可以看看这篇文章
在开发过程中,很多时候需要定时器,然而:::::::::::
1、如果这样定义定时器,将会很大缺陷,有时会出奇怪的错误
// 定义一个定时器
timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(repeat:) userInfo:@{@"key":@"value"} repeats:true];
2、每个线程都有一个RunLoop,苹果不允许自己创建RunLoop,但是提供了两个方法来获取线程的RunLoop:CFRunLoopGetMain() 和 CFRunLoopGetCurrent()。
NSTimer是被添加到了RunLoop中来循环处理
[[NSRunLoop currentRunLoop] run];
3、这行代码的作用就是打开当前线程的runLoop,在cocoaTouch框架中只有主线程的RunLoop是默认打开的,而其他线程的RunLoop如果需要使用就必须手动打开,所以如果我们是想要添加到主线程的RunLoop的话,是不需要手动打开RunLoop的。然而很多时候我们需要给定时器独立的线程
4、所以,关于添加定时器,最好这么做
OC:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(repeat:) userInfo:@{@"key":@"value"} repeats:true];
[[NSRunLoop currentRunLoop] run];
});
swift :
var timer = NSTimer()
dispatch_async(dispatch_get_global_queue(0, 0)) {
self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(self.nextWord), userInfo: ["key":"value"], repeats: true)
NSRunLoop.currentRunLoop().run()
}
为了安全记得在viewWillDisappear销毁
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
self.timer.invalidate()
}