? ? ? ? ?最近過年來打算換工作,因為搭檔一直請假在家的原因沒法進行交接,就臨時替公司面試了二十來個人,發現過年來找工作的人好多呀,頓時覺得心里壓力好大。我也在網上看了一些面試題和筆試題。想來總結一下這幾天面試的心得。
一,在網上看面試題發現出題人對于面試者關于多線程的問題還是比較重視的。比如線程的任務和隊列問題是比較多的。我們平時常用的是GCD,分為同步執行(sync)和異步執行(async)和隊列組(dispatch_group)問題。
在隊列組中,重點考察了隊列組notify的使用,比如在多線程的異步執行中,當添加的任務都已經執行完畢以后,再回到主線程執行任務。
例如:
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的異步任務1、任務2都執行完畢后,回到主線程執行下邊任務for(inti =0; i <2; ++i) { [NSThreadsleepForTimeInterval:2];// 模擬耗時操作NSLog(@"3---%@",[NSThreadcurrentThread]);
// 打印當前線程}NSLog(@"group---end"); });
還有一個線程信號的問題,dispatch_semaphore,通過控制計數的問題來控制線程的執行。
二,為了增加一點面試的難度,在網上找了幾個坑用來面試的時候提問,
1.在GCD找了一個線程隊列組組,在其中一個異步線程中還包含了一個異步線程,然后使用隊列組notify,結果基本上全部面試者中了埋伏,都覺得是執行notify的時候,各個線程組里面的線程已經執行完畢,結果打印顯示,先執行了各個隊列線程組的第一個異步線程,然后走的最后的notify,最后才進了隊列線程組里面的異步線程里面的異步線程。其實也算大家一起學習了。然后就想到了應該使用線程信號dispatch_semaphore問題來解決,當然使用NSOperationQueue能更好的解決這個問題。
2.封裝了一個網絡請求,在每次網絡請求前我都加了一個SVP的菊花來增加顯示效果,在每次請求成功或者失敗以后通過SVP的提示消除菊花,然后在一個界面里面是有2個網絡請求,我通過創建新線程在2個請求結束以后才能回到主線程更新UI界面,然后讓面試者找問題。結果真是問題藏得比較深,只有3.4個人看出了問題。因為網絡請求是在分線程中進行的,而網絡封裝里面因為加了菊花展示,所以就是在分線程中修改了UI,就會有報錯提示。