线程是和runloop一一对应的。
自己创建的线程默认是没有runloop的。
思考 怎样实现一个常驻线程?
1.为当前线程开启一个runloop;
createRunloop方法会查找当前线程是否有runloop,如果没有则系统会为我们创建一个
2.向该runloop中添加一个port/source等维持runloop的事件循环
3.启动该runloop
代码实践:
创建一个线程安全的thread并启动.png 屏幕快照 2018-05-11 11.39.05.png
注意:运行的模式和添加的mode需要是同一个,比如上图的kCFRunLoopDefaultMode
思考:怎样保证子线程数据回来更新UI的时候,不打断用户的滑动操作?
当用户滑动的时候,当前的runloop运行在trackingMode模式下,我们可以把子线程抛会主线程更新UI这段逻辑封装到主线程的defaultMode下,这样抛回来的任务当用户滑动的时候,就不会执行打断用户滑动;当滑动结束后,主线程切回到defaultMode就可以执行更新ui数据。