iOS经典面试题之分析GCD的dispatch_group任务执行问题
生活随笔
收集整理的這篇文章主要介紹了
iOS经典面试题之分析GCD的dispatch_group任务执行问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
① dispatch_group 異步執(zhí)行任務(wù)
- 現(xiàn)有以下調(diào)度組 dispatch_group 執(zhí)行多個任務(wù),將 dispatch_group_notify 放在調(diào)度組異步執(zhí)行任務(wù),那么它們的任務(wù)執(zhí)行順序是怎么樣的呢?
- 執(zhí)行程序,結(jié)果如下:
- 分析:
- dispatch_group 執(zhí)行任務(wù)開始時, 程序由上到下執(zhí)行任務(wù)1、任務(wù)2、任務(wù)3、任務(wù)4;
- 由于任務(wù)4沒有在調(diào)度組中,因此優(yōu)先執(zhí)行;
- 然后有兩個調(diào)度組異步執(zhí)行任務(wù)1和任務(wù)2,最后再通知主線程執(zhí)行任務(wù)3;
- 由于第一個任務(wù)1中線程sleep(1),因此任務(wù)2會比任務(wù)1優(yōu)先完成;
- 最后再通知主線程執(zhí)行任務(wù)3,更新UI。
② 如果將 dispatch_group_notify 移動到最前面,能否執(zhí)行?執(zhí)行結(jié)果是怎樣的呢?
- 代碼修改如下:
- 執(zhí)行結(jié)果如下:
- 可以看到程序能正常執(zhí)行,但是只要有 enter-leave 成對匹配,notify 就會執(zhí)行,不會等兩個調(diào)度組都執(zhí)行完畢,即只要 enter-leave 成對程序就可以執(zhí)行。
③ 再加一個enter,即 enter:wait 是 3:2,能否執(zhí)行 notify ?
- 修改代碼如下:
- 執(zhí)行結(jié)果如下:
- 可以看到,程序不能正常執(zhí)行完畢,會一直等待,這是因?yàn)榈却?leave 的執(zhí)行,最后才會執(zhí)行 notify。
- 如果 dispatch_group_enter 比 dispatch_group_leave 多,由于 value 不等于 dsema_orig 不會走到喚醒邏輯, dispatch_group_notify 中的任務(wù)無法執(zhí)行或者 dispatch_group_wait 收不到信號而卡住線程。
④ 如果是 enter:wait 是 2:3,能否執(zhí)行 notify ?
- 修改代碼如下:
- 執(zhí)行程序之后,可以看到程序會延遲崩潰在任務(wù)1的 dispatch_group_leave(group),這是因?yàn)?enter-leave 沒有成對匹配,dispatch_group 沒有 enter 卻需要 leave,導(dǎo)致 value 不等于 dsema_orig 不會執(zhí)行喚醒邏輯。
總結(jié)
以上是生活随笔為你收集整理的iOS经典面试题之分析GCD的dispatch_group任务执行问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS之深入分析GCD的函数与队列以及多
- 下一篇: iOS经典面试题之分析self clas