美文网首页iOS沉淀
iOS开发 在异步线程里面添加定时器,或者perform aft

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

作者: 晴川历历汉阳树丶 | 来源:发表于2020-09-28 16:04 被阅读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
    

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/fqgduktx.html