正常情况下,使用该函数进行延迟执行是可以正常直接Selector的方法的,但是当我们建立一个子线程,在子线程调用改方法的时候就会出现无法正常调用的问题。
查看该方法的Discussion,可知在使用这个延时函数的时候,会在内部创建一个NSTimer,然后添加到该线程的Runloop里面,如果当前线程没有开启Runloop,这个方法就会进行等待,直到启动Runloop才会执行。
解决方案,把该线程的Runloop启动即可,代码如下:
override func viewDidLoad() {
super.viewDidLoad()
print("1")
let queue = DispatchQueue(label: "label")
queue.async {
self.perform(#selector(self.action), with: nil, afterDelay: 2)
RunLoop.current.run()
}
print("2")
}
@objc func action() {
print("3")
}
执行打印的顺序为1,2,3。