Objective-C 多线程编程与 GCD|青训营笔记

52 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

进程

RunLoop

RunLoop是事件接受和分发机制的一个实现,可以让线程在适当的时间处理任务不会退出iOS App中,主线程的RunLoop在程序运行时就会启动,其他线程的RunLoop需要手动启动

  • 主线程
    • iOS App启动时会默认开启一条线程,称为主线程,用于描绘UI界面和处理UI交互事件,又称UI线程
    • 耗时操作会妨碍主线程中的执行,会引起App卡顿

多线程

  • 优点

    • 提高程序执行效率
    • 提高资源利用率
  • 缺点

    • 创建线程、线程调度多有开销成本,大量线程会影响程序性能
    • 线程的安全问题
  • POSIX Thread

    • 类UNIX系统通用的对线程API
    • 跨平台/可移植
    • C语言接口
    • 程序员管理线程生命周期
  • NSThread

    • 苹果官方提供的面向对象API
    • OC接口,可以通过KVO监听部分属性
    • 程序员管理线程生命周期
  • GCD(Grand Central Dispatch)

    • 自动使用更多CPU内核
    • 自动管理线程的生命周期
    • 提供了易于使用的并发模型
    • 无需多余的线程管理任务
  • NSOperation 基于GCD的多线程编程

    • OC接口,面向对象
    • 可指定任务之间的依赖关系,控制执行顺序
    • 支持设定任务并发数
    • 支持取消任务,可用于KVO监听任务状态

246657-986c0acf7111892b.png

同步执行异步执行

并发队列串行队列主队列
同步执行(dispatch_sync)不开启新线程,在当前线程串行执行任务不开启新线程,在当前线程串行执行任务发生死锁
异步执行(dispatch_async)会开启新线程,并发执行任务开启一条新线程,串行执行任务不开启新线程,在当前线程的下一个runloop执行任务
  • dispatch_after
    • 在指定时间点之后执行某个任务
  • dispatch_group
    • 执行完Dispatch Queue中所有任务后再执行某个任务
    • dispatch_group_wait可以设置等待group执行的时间上限
  • dispatch_apply
    • 按照指定的次数将指定的任务追加到派分队列,并等待队列中全部任务执行结束
  • dispatch_once
    • 某个操作在应用程序生命周期只执行一次

线程安全

  • atomic
    • 对属性getter、setter调用是线程安全的
    • 需要耗费资源为属性加锁
  • nonatomic
    • 访问不是线程安全的
    • 访问效率比atomic更高

应用

  • 从网络加载图片
  • 一个页面有多个请求,需要全部请求都返回的时候刷新界面
  • 实现一个线程安全的容器类