错误日志博客iOS Swift && Objective-C将来跳槽用

Runloop -运行循环的简单介绍

2016-11-05  本文已影响607人  vvkeep

一、特性

二、Runloop Mode

苹果文档中提到的 Mode 有五个:

iOS公开出来的只有两个:


mode.png

一个常见的问题就是,主线程中一个NSTimer添加在default mode中,当界面上有一些scroll view的滚动频繁发生导致run loop运行在UItraking mode中,从而这个timer没能如期望那般的运行。所以,我们就可以把这个timer加到NSRunLoopCommonModes中来解决
举个栗子: 如果有TableView上有轮播图(NSTimer), 则在滚动TableView的时候,定时器是不好使的, 因为添加定时器默认是在kCFRunLoopDefaultMode下的

三、Runloop 应用

如果我们将定时器放到UITrackingRunLoopMode
模式下, 则只有在拖动的时候,定时器才可以工作, 代码如下:

// 调用了scheduledTimer返回的NSTimer的定时器对象,已经被自动添加到当前的runLoop中(一个线程对应一个runloop,如果在子线程中添加定时器..添加到子线程的runloop中),默认为NSDefaultRunLoopMode模式
        let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(printAction), userInfo: nil, repeats: true)
        RunLoop.current.add(timer, forMode: .UITrackingRunLoopMode)
        
        // 如果需要更改模式, 直接这样就可以
        RunLoop.current.add(timer, forMode: .commonModes)```

iOS 10 加入新闭包形式的写法,

// NSDefaultRunLoopMode:NSTimer只有在默认模式下(NSDefaultRunLoopMode)工作,切换到其他模式不再工作,比如拖拽了界面上的某个控件(会切换成UITrackingRunLoopMode)
let timer = Timer.init(timeInterval: 1, repeats: true) { (timer) in
print("新timer执行了")
}
RunLoop.current.add(timer, forMode: .defaultRunLoopMode)```

CADisplayLink如果NSTimer一样, 也是添加到模式中

上一篇 下一篇

猜你喜欢

热点阅读