线程之定时器

时间:2022-05-11 00:10:11

使用定时器会出奇怪的错误,那么你可以看看这篇文章

在开发过程中,很多时候需要定时器,然而:::::::::::

参考链接::简书作者–StrongX

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()
}