iOS沉淀

iOS开发 在异步线程里面添加定时器,或者perform aft

2020-09-28  本文已影响0人  晴川历历汉阳树丶

我们创建一个异步线程,然后在异步线程中添加了一个定时器或者 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
上一篇下一篇

猜你喜欢

热点阅读