我们创建一个异步线程,然后在异步线程中添加了一个定时器或者 self.perform( with: afterDelay: )
时,等时间到了,却发现没有响应对应的方法。
@objc func doPerform() {
DispatchQueue.init(label: "com.perform.queue").async {
self.perform(#selector(self.performAction(objc1:)), with: "1", afterDelay: 3)
}
}
@objc func performAction(objc1:Any) {
print(objc1)
}
原因是:在iOS中,不管是用Timer也好,还是使用perfor afterDelay
方法也好,其本质都是会创建一个定时器。而定时器的工作原理,就是添加到runloop中,靠事件驱动来循环触发的。所以,这个触发条件的核心就是runloop必须要在运行。其实在每一条线程里面,都包含了一个runloop。但是呢,只有在主线程里面的runloop是默认开启的,其他子线程的runloop是要我们去手动开启的。这也就是为什么我们直接在主线程中添加一个定时器,就可以直接运行,而在异步线程中,却出现无法响应的问题。
解决方法:
让异步线程里面的runloop跑起来:
@objc func doPerform() {
DispatchQueue.init(label: "com.perform.queue").async {
print(Thread.current)
self.perform(#selector(self.performAction(objc1:)), with: "1", afterDelay: 3)
RunLoop.current.run()
}
}
@objc func performAction(objc1:Any) {
print(objc1)
}
打印信息
<NSThread: 0x60000300c1c0>{number = 5, name = (null)}
1
网友评论