iOS开发高手课
戴铭
前滴滴出行技术专家
立即订阅
11464 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 锚定一个点,然后在这个点上深耕
免费
基础篇 (20讲)
01 | 建立你自己的iOS开发知识体系
02 | App 启动速度怎么做优化与监控?
03 | Auto Layout 是怎么进行自动布局的,性能如何?
04 | 项目大了人员多了,架构怎么设计更合理?
05 | 链接器:符号是怎么绑定到地址上的?
06 | App 如何通过注入动态库的方式实现极速编译调试?
07 | Clang、Infer 和 OCLint ,我们应该使用谁来做静态分析?
08 | 如何利用 Clang 为 App 提质?
09 | 无侵入的埋点方案如何实现?
10 | 包大小:如何从资源和代码层面实现全方位瘦身?
11 | 热点问题答疑(一):基础模块问题答疑
12 | iOS 崩溃千奇百怪,如何全面监控?
13 | 如何利用 RunLoop 原理去监控卡顿?
14 | 临近 OOM,如何获取详细内存分配信息,分析内存问题?
15 | 日志监控:怎样获取 App 中的全量日志?
16 | 性能监控:衡量 App 质量的那把尺
17 | 远超你想象的多线程的那些坑
18 | 怎么减少 App 电量消耗?
19 | 热点问题答疑(二):基础模块问题答疑
20 | iOS开发的最佳学习路径是什么?
应用开发篇 (12讲)
21 | 除了 Cocoa,iOS还可以用哪些 GUI 框架开发?
22 | 细说 iOS 响应式框架变迁,哪些思想可以为我所用?
23 | 如何构造酷炫的物理效果和过场动画效果?
24 | A/B 测试:验证决策效果的利器
25 | 怎样构建底层的发布和订阅事件总线?
26 | 如何提高 JSON 解析的性能?
27 | 如何用 Flexbox 思路开发?跟自动布局比,Flexbox 好在哪?
28 | 怎么应对各种富文本表现需求?
29 | 如何在 iOS 中进行面向测试驱动开发和面向行为驱动开发?
30 | 如何制定一套适合自己团队的 iOS 编码规范?
31 | iOS 开发学习资料和书单推荐
32 | 热点问题答疑(三)
原理篇 (6讲)
33 | iOS 系统内核 XNU:App 如何加载?
34 | iOS 黑魔法 Runtime Method Swizzling 背后的原理
35 | libffi:动态调用和定义 C 函数
36 | iOS 是怎么管理内存的?
37 | 如何编写 Clang 插件?
38 | 热点问题答疑(四)
原生与前端共舞 (5讲)
39 | 打通前端与原生的桥梁:JavaScriptCore 能干哪些事情?
40 | React Native、Flutter 等,这些跨端方案怎么选?
41 | 原生布局转到前端布局,开发思路有哪些转变?
42 | iOS原生、大前端和Flutter分别是怎么渲染的?
43 | 剖析使 App 具有动态化和热更新能力的方案
用户故事 (1讲)
用户故事 | 我是如何学习这个专栏的?
结束语 (1讲)
结束语 | 慢几步,深几度
iOS开发高手课
登录|注册

17 | 远超你想象的多线程的那些坑

戴铭 2019-04-18
你好,我是戴铭。今天,我们一起来聊聊 iOS 开发中,使用多线程技术会带来的那些问题。
我们可以先来试想这么一个场景,如果没有多线程技术,那么我们要对一张照片进行滤镜处理时,就只能由主线程来完成这个处理。可想而知,这时候主线程阻塞了,其他的任何操作都无法继续。
解决这个问题的方法,就是再多创建一个线程来进行滤镜处理的操作,这样主线程就可以继续执行其他操作。这,也就是我们今天要说的多线程技术了。
目前,在 iOS 开发中,我们经常会用到系统提供的方法来使用多线程技术开发 App,期望可以充分利用硬件资源来提高 App 的运行效率。
但是,我们不禁会想到,像 UIKit 这样的前端框架并没有使用多线程技术。而 AFNetworking 2.0(网络框架)、FMDB(第三方数据库框架)这些用得最多的基础库,使用多线程技术时也非常谨慎。
那么,你有没有想过为什么 UIKit 不是线程安全的,UI 都要在主线程上操作。
在 AFNetworking 2.0 中,把每个请求都封装成了单独的 NSOperationQueue,再由 NSOperationQueue 根据当前的 CPU 数量和系统负载来控制并发。那么,为什么 AFNetworking 2.0 没有为每个请求创建一个线程,而只是创建了一个线程,用来接收 NSOperationQueue 的回调呢?
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《iOS开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(30)

  • tripleCC
    关于NSURLConnection和URLSession那块有一个地方讲的感觉不是很清楚。NSURLConnection也可以设置执行代理的queue,通过setDelegateQueue:方法,本质上是NSURLConnection的机制需要创建此对象的线程的RunLoop去监听网络事件,然后执行注册的回调,所以在网络回来前,需要保持RunLoop的运行状态。NSURLSession应该是内部做了这个事情,所以发请求不需要所在线程“常驻”,而不是因为我们可以设置delegateQueue。从代理方法的调用栈看,NSURLSession的代理任务都是在com.apple.NSURLSession-work这个queue被塞进delegateQueue的,如果不设置delegateQueue的话,代理任务就在work队列执行,设置之后再派发到对应的队列。具体在work队列之前做了什么,还没看到比较具体的资料,不过基于底层都是CFNetworking,这个又是Source0,可能做的和常驻线程相似。
    2019-04-22
    1
    27
  • 唯她命
    老师你好,有个问题一直不理解,既然afn2.0讲所有的请求和回调 放在一个常驻线程里面,那么afn2.0的所有网络请求都在一个线程里了,那afn2.0岂不是单线程的吗?
    2019-04-18
    1
    8
  • SweetTroy
    多线程是有很多坑,但是多线程的好处以及如何正确使用多线程能讲讲吗?看完感觉没什么干货。
    2019-05-06
    5
  • 西行客
    面试中遇到一个非常坑的问题,请教一下老师。面试官问:除了加锁,还有什么其他办法能够保证数据线程安全?
    2019-04-18
    4
    5
  • kidzss
    多读单写的,既保证性能,又可以保证数据安全
    2019-04-29
    3
  • Cocoaleeo
    我帮老师回答一下各位的问题吧。@维他命:常驻线程和单线程不是一个概念;@kevin:AFN3.0的问题建议看一下源码;@烩面:正常来说,只要内存够,就可以一直开线程,但这样很不现实,所以可以通过第7,8,10节课的内容进行监控优化。
    2019-04-18
    3
  • kevin
    大佬,AFN3.0的回调代理,“可以指定回调的 delegateQueue,不再需要在当前线程进行代理方法的回调” 具体是怎么实现的,能讲讲吗?
    2019-04-18
    3
  • 朱亚南
    项目中需要每隔几秒同步一次服务器数据,对同步回来的数据需要做一系列的处理;开了个异步并行队列处理同步,引发了资源抢夺等问题,展示通过加锁解决,效果并不好,感觉失去了并发的意义
    2019-04-18
    3
  • 烩面
    老师问个问题:一个 app 有线程数量的限制吗?或者说,通常情况下,线程数达到多少就被系统 kill 掉了?

    作者回复: 不要超过64个

    2019-04-18
    1
    2
  • salmon
    多线程并发数量和可控需要怎么做到呢?老师应该讲一下方案、不能怕并发多就改成串行,多线程的意义呢?

    作者回复: 不是说不要用而是不要滥用,比如需要短时间内快速处理数据的情况,使用多线程正好可以利用多核性能来高效完成任务。很多三方库之所以使用串行的原因就是为了避免大部分情况下多线程技术被滥用。

    2019-04-18
    2
  • 赫小僧
    看到评论中有人问线程堆栈大小,通过NSThread的stackSize属性/1024就可以得到多少k。目前我查看的解说是主线程、子线程大小都是512k。
    2019-06-08
    1
  • Calabash_Boy
    当初的项目之一需要等到两个网络请求返回数据后,才能继续页面的刷新,通过GCD的队列组和信号量来解决的;
    2019-04-24
    1
  • Dashing
    按照我粗浅的理解,串行队列背后也是一个线程,貌似跟常驻线程也差不多

    作者回复: 常驻线程是一直存在的

    2019-04-22
    1
  • SmileLong
    使用GCD串行队列在IO操作时遇到磁盘等待一样会出现重复创建线程的问题,其实GCD并发线程反倒不会有这个问题
    2019-04-21
    1
  • Geek_0ce7bf
    在 AFNetworking 2.0 中,把每个请求都封装成了单独的 NSOperationQueue。大佬你这句话写错了吧?每个请求都封装成了单独的 NSOperation才对吧?????

    作者回复: 是的

    2019-04-20
    1
  • 感觉还可以讲的深入点。多线程有坑,除了尽量使用串行队列来避坑以外,还有哪些手段来规避?以及其他手段该注意的点也可以说说
    2019-04-20
    1
  • 三刀流剑客
    之前开发日志的时候多线程的坑: 公用参数获取是在异步线程中进行的, 创建了一个NSMutableDictionary, 其中有几个参数获取必须在主线程,所以就dispatch 到主线程中 setObject:forKey: 了, 然后就crash了,这里的写操作是从一个线程跳到另一个线程 : 最后的修改是这些setObject:forKey:都放到同一个线程执行, NSMutableDictionary 是类簇生成的一个对象
    2019-04-19
    1
  • sacrifice
    老师,我for循环10000次创建子线程,内存消耗的也不明显啊

    作者回复: 子线程里做了什么?

    2019-04-18
    1
  • 月落泉
    自己创建的子线程需要添加@autoreleasepool吗?
    2019-09-18
  • Eddiegooo
    只有我没遇到什么多线程问题么? 怎么感觉没怎么用多线程啊
    2019-08-27
收起评论
30
返回
顶部