iOS 關於dispatch_semaphore_t 同步執行
前言
方法以及作用:當我們在編輯專案時遇到網路請求或者開啟子執行緒執行時,執行緒和請求之外的邏輯需要等待它執行完才可以執行,這時用dispatch_semaphore_t可以滿足需求。
dispatch_semaphore_t 用法
//建立訊號
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
//發射訊號
dispatch_semaphore_signal(sema);
//等待訊號
dispatch_semaphore_wait(sema, 1.0);
使用訊號量 dispatch_semaphore_t 控制請求
- (NSArray *)p_upData{
//存放資料
NSMutableArray * array = [NSMutableArray arrayWithCapacity:0];
//替代我們平時常用的非同步網路請求
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for (int i=0; i<10; i++) {
[array addObject:[NSNumber numberWithInt:i]];
}
NSLog(@"array = %@",array);
});
return array;
}
輸出下上面的方法
NSArray * dataArray = [self p_upData];
NSLog(@"dataArray = %@",dataArray);
2018-04-17 10:30:45.868 HTMITest dataArray = (
)
2018-04-17 10:30:45.875 HTMITest array = (
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
)
想要的結果沒有輸出,但是檢視這個陣列他肯定有值。
- 現在我們把上述方法修改下,使用訊號量控制,再來看看結果
- (NSArray *)p_upData{
//修改下面的程式碼,使用訊號量來進行一個同步資料
//我們傳入一個引數0 ,表示沒有資源,非0 表示是有資源,這一點需要搞清楚
//這裡的整形引數如果是非0 就是總資源
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
//假如下面這個陣列是用來存放資料的
NSMutableArray * array = [NSMutableArray arrayWithCapacity:0];
//下面這個來代替我們平時常用的非同步網路請求
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for (int i=0; i<10; i++) {
[array addObject:[NSNumber numberWithInt:i]];
}
NSLog(@"array = %@",array);
dispatch_semaphore_signal(sema);
});
//訊號等待 時,資源數 -1 阻塞當前執行緒
dispatch_semaphore_wait(sema, 1.0);
return array;
}
- 訊號量的理解:
我們初始化的時候會先設定一個訊號總量,如果訊號總量的整形引數是0 ,那麼就是沒有資源需要等待,我們如果下面執行wait 操作,那麼相當於執行緒擁堵,執行訊號-1 操作
- 再次看下控制檯的輸出:
2018-04-17 10:36:17.361 HTMITest array = (
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
)
2018-04-17 10:36:17.364 HTMITest resultArrsy = (
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
)
相關文章
- iOS執行緒、同步非同步、序列並行佇列iOS執行緒非同步並行佇列
- iOS 多執行緒--GCD 序列佇列、併發佇列以及同步執行、非同步執行iOS執行緒GC佇列非同步
- fastapi 關於執行緒池、同步、非同步的問題解答彙總ASTAPI執行緒非同步
- c#關於同步 /異常/多執行緒/事件 事例C#執行緒事件
- 執行緒關鍵字、鎖、同步集合筆記執行緒筆記
- 執行緒與同步非同步執行緒非同步
- 面試中關於多執行緒同步,你必須要思考的問題面試執行緒
- 關於 Promise 的執行順序Promise
- 執行緒的同步執行緒
- 執行緒同步方法執行緒
- 理解執行緒同步執行緒
- 深入執行緒同步執行緒
- 多執行緒和多執行緒同步執行緒
- 關於redis單執行緒的分析Redis執行緒
- 關於執行緒設計的感受執行緒
- java基礎 關於執行緒安全Java執行緒
- JS執行機制--同步與非同步JS非同步
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- iOS 多執行緒之執行緒安全iOS執行緒
- 關於非同步AJAX請求執行速度過快問題非同步
- 關於forEach同步非同步的問題非同步
- java 多執行緒 –同步Java執行緒
- java 多執行緒 --同步Java執行緒
- 執行緒同步機制執行緒
- 關於Python能再Pycharm上執行而在VSCode下無法執行PythonPyCharmVSCode
- 關於執行緒池的面試題執行緒面試題
- 關於執行緒的幾個函式執行緒函式
- 關於命令執行與反序列化
- 關於Java多執行緒的執行緒同步和執行緒通訊的一些小問題(順便分享幾篇高質量的博文)Java執行緒
- QT執行緒同步與非同步處理QT執行緒非同步
- java執行緒同步:synchronized關鍵字,Lock介面以及可重Java執行緒synchronized
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- iOS多執行緒整理iOS執行緒
- iOS:常駐執行緒iOS執行緒
- 【Swift】iOS 執行緒鎖SwiftiOS執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- 關於JS下大批量非同步任務按順序執行解決方案一點思考JS非同步
- 關於iOS進階之路iOS