多线程和runloop

2017-09-02  本文已影响18人  b470b9fc7145

1.主线程的runLoop是一直在运行的
2.其他线程的runLoop需要手动开启,但是不能自己创建
3.苹果不允许直接创建 RunLoop,它只提供了两个自动获取的函数:CFRunLoopGetMain() 和 CFRunLoopGetCurrent()
4.一个线程执行完会自动销毁的,里面创建的runLoop也跟着销毁了
5.FDTemplateLayoutCell只是在空闲的时候去缓存计算cell的高度(主线程,不用担心线程执行完关闭的问题/ observer计算完了进行了手动移除)
6.AFN是采用后台的线程中开启runloop;至于后台线程是否一直存在,这个需要再看下源码
7.如果手动创建线程(貌似只能用NSThread,其他的不能手动创建),需要自己手动释放.

RunLoop与线程

  1. 每条线程都有唯一的一个与之对应的RunLoop对象
  2. 主线程的RunLoop(直接在 main函数里加)已经自动创建好了,子线程的RunLoop需要主动创建
  3. RunLoop在第一次获取时创建,在线程结束时销毁

获得RunLoop对象

RunLoop相关类

多线程

  1. 全局队列为系统创建,不需要自己创建,拿过来就用,用着方便并行队列和全局队列执行效果相同
  2. 全局队列没有名称,调试时,无法确认准确队列
  3. 每一个应用程序都只有一个主线程
  4. iOS开发中所有UI更新工作都必须在主线程上执行,因为线程安全需要消耗性能,苹果为了保留性能优势所以放弃了线程安全 ,所以改UI都要在主线程上.
  5. 异步任务任务在主线程上是保持队形的,也就是异步是在主线程6. 一个线程上执行的主线程不可以执行同步任务,因为同步任务是要等到上一个线程结束后才会执行,但是主线程一直不会停止当前的任务,所以它不会去执行一个同步任务
  6. 无论什么队列和什么任务,线程的创建和回收不需要程序员参与,线程的创建和回收工作是由队列负责的

GCD

NSOperationQueue

线程操作

三种多线程技术的对比

总结

任务加到队列--->队列(同步/异步)-->开启线程-->线程执行-->线程执行完任务自动关闭线程

参考资料

iOS程序启动与运转- RunLoop个人小结
RunLoop 原理和核心机制
多图下载源码
iOS多线程篇之GCD

上一篇下一篇

猜你喜欢

热点阅读