前言
方法以及作用:當(dāng)我們在編輯項目時遇到網(wǎng)絡(luò)請求或者開啟子線程執(zhí)行時蔽挠,線程和請求之外的邏輯需要等待它執(zhí)行完才可以執(zhí)行,這時用dispatch_semaphore_t可以滿足需求。
dispatch_semaphore_t 用法
//創(chuàng)建信號
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
//發(fā)射信號
dispatch_semaphore_signal(sema);
//等待信號
dispatch_semaphore_wait(sema, 1.0);
使用信號量 dispatch_semaphore_t 控制請求
- (NSArray *)p_upData{
//存放數(shù)據(jù)
NSMutableArray * array = [NSMutableArray arrayWithCapacity:0];
//替代我們平時常用的異步網(wǎng)絡(luò)請求
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
)
想要的結(jié)果沒有輸出脸秽,但是查看這個數(shù)組他肯定有值秦驯。
- 現(xiàn)在我們把上述方法修改下,使用信號量控制德澈,再來看看結(jié)果
- (NSArray *)p_upData{
//修改下面的代碼歇攻,使用信號量來進行一個同步數(shù)據(jù)
//我們傳入一個參數(shù)0 ,表示沒有資源梆造,非0 表示是有資源缴守,這一點需要搞清楚
//這里的整形參數(shù)如果是非0 就是總資源
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
//假如下面這個數(shù)組是用來存放數(shù)據(jù)的
NSMutableArray * array = [NSMutableArray arrayWithCapacity:0];
//下面這個來代替我們平時常用的異步網(wǎng)絡(luò)請求
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);
});
//信號等待 時,資源數(shù) -1 阻塞當(dāng)前線程
dispatch_semaphore_wait(sema, 1.0);
return array;
}
- 信號量的理解:
我們初始化的時候會先設(shè)置一個信號總量镇辉,如果信號總量的整形參數(shù)是0 屡穗,那么就是沒有資源需要等待,我們?nèi)绻旅鎴?zhí)行wait 操作忽肛,那么相當(dāng)于線程擁堵村砂,執(zhí)行信號-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
)