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
)
相關文章
- GCD使用dispatch_semaphore_t建立多執行緒網路同步請求GC執行緒
- iOS執行緒、同步非同步、序列並行佇列iOS執行緒非同步並行佇列
- fastapi 關於執行緒池、同步、非同步的問題解答彙總ASTAPI執行緒非同步
- iOS 多執行緒--GCD 序列佇列、併發佇列以及同步執行、非同步執行iOS執行緒GC佇列非同步
- 請教大俠。關於多執行緒同步問題執行緒
- c#關於同步 /異常/多執行緒/事件 事例C#執行緒事件
- 關於iOS多執行緒通訊的相關總結iOS執行緒
- 關於iOS多執行緒,你看我就夠了iOS執行緒
- iOS多執行緒程式設計:執行緒同步總結iOS執行緒程式設計
- 關於執行力
- 關於iOS中的執行緒安全和使用場景iOS執行緒
- iOS多執行緒非同步訊號量iOS執行緒非同步
- 關於“UI執行緒”UI執行緒
- 關於 iOS/OS X 執行緒安全的基礎知識iOS執行緒
- 關於多執行緒控制執行緒
- 關於java的執行流程Java
- 關於多執行緒(轉)執行緒
- 面試中關於多執行緒同步,你必須要思考的問題面試執行緒
- 執行緒同步執行緒
- 執行緒與同步非同步執行緒非同步
- 執行緒關鍵字、鎖、同步集合筆記執行緒筆記
- 執行緒同步C#關鍵字:lock,monitor執行緒C#
- C#執行緒間同步無法關閉C#執行緒
- 關於 Promise 的執行順序Promise
- 關於執行緒的問題...執行緒
- c#執行緒-執行緒同步C#執行緒
- 執行緒同步及執行緒鎖執行緒
- java執行緒學習5——執行緒同步之同步方法Java執行緒
- 執行緒的同步執行緒
- 理解執行緒同步執行緒
- 深入執行緒同步執行緒
- Java—執行緒同步Java執行緒
- 多執行緒同步執行緒
- .net執行緒同步執行緒
- 執行緒同步方法執行緒
- 關於redis單執行緒的分析Redis執行緒
- 關於執行緒設計的感受執行緒
- java基礎 關於執行緒安全Java執行緒