美文网首页
多线程和runloop

多线程和runloop

作者: b470b9fc7145 | 来源:发表于2017-09-02 13:08 被阅读18次

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对象

  • Foundation
    • [NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象
    • [NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象
  • Core Foundation
    • CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象
    • CFRunLoopGetMain(); // 获得主线程的RunLoop对象

RunLoop相关类

  • Core Foundation中关于RunLoop的5个类
    • CFRunLoopRef//要监听的对象
    • CFRunLoopModeRef
    • CFRunLoopSourceRef
    • CFRunLoopTimerRef
    • CFRunLoopObserverRef

多线程

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

GCD

  • 所有开线程的前提是,有任务加到队列中
  • sync 同步函数不会开线程
  • async 异步函数会开线程
  • 有了线程,才存在runLoop这个东西

NSOperationQueue

  • 默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作-----在 main线程中
线程操作
  • 只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作--在子线程中

三种多线程技术的对比

  • NSThread:

    • 优点:NSThread 比其他两个轻量级,使用简单
    • 缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销(需要自己想AFN一样使用autoreleasepool)
  • NSOperation:

    • 不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上
    • NSOperation是面向对象的
  • GCD:

    • Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和强大的技术
    • GCD是基于C语言的
    • GCD是一个苹果公司用C语言开发的框架,好在iOS6.0以后,GCD对象被纳入了ARC的管理范围,因此不再需要手动管理GCD的内存了。如果你的工程部署的最低目标低于iOS6.0或者Mac OSX 10.8,则需要手动管理GCD内存。

总结

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

参考资料

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

相关文章

  • RunLoop的使用

    RunLoop是什么? 它有什么作用?Runloop和多线程又是什么关系?timer 与 Runloop 有什么关...

  • RunLoop

    iOS刨根问底-深入理解RunLoop runloop 和线程有什么关系 iOS 多线程:RunLoop详细总结

  • GeekBand - iOS 多线程和RunLoop 总结

    iOS 开发高级进阶 第三周 多线程 Runloop iOS 多线程以及 RunLoop 学习总结 基础知识 什么...

  • iOS 多线程:『RunLoop』详尽总结

    本文用来介绍 iOS 多线程中,RunLoop 的相关知识。主要包括如下内容:RunLoop 简介RunLoop ...

  • iOS POSIX多线程编程

    关于多线程的介绍、多线程的创建、使用场景和Runloop可以参考《iOS多线程编程指南》。已上传到GitHub仓库...

  • iOS RunLoop 详解

    转自 iOS RunLoop 详解 image.png Runloop 是和线程紧密相关的基础组件,是很多多线程有...

  • Runloop和多线程

    在CFRunloop中已经说明了一个线程及其runloop的对应关系 ,现在以iOS中NSThread的实际使用来...

  • 多线程和runloop

    //// RunLoopTest.m import "RunLoopTest.h" import

  • 多线程和runloop

    1.主线程的runLoop是一直在运行的2.其他线程的runLoop需要手动开启,但是不能自己创建3.苹果不允许直...

  • RunLoop初探,满足项目的基本应用

    iOS开发肯定离不开多线程编程,而多线程又跟RunLoop有着密切的关系,这篇文章就来解剖下RunLoop。 每个...

网友评论

      本文标题:多线程和runloop

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