多線程信號量,可以在多線程下控制多線程的并發(fā)數目趾代。主要涉及三個方法:
1、創(chuàng)建信號量伴奥,可以設置信號量的資源數写烤;
dispatch_semaphore_t dispatch_semaphore_create(long value);
2、通知信號拾徙,信號量的值加1洲炊;
long dispatch_semaphore_signal(dispatch_semaphore_t dsema);
3、等待信號锣吼,可以設置超時參數选浑,信號量的值減1;
long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
同時方法3等待信號也決定了該方法后面語句是否執(zhí)行玄叠,什么時候執(zhí)行的關鍵設置古徒;如果dsema信號量的值大于0,該函數所處線程就繼續(xù)執(zhí)行下面的語句读恃,并且將信號量的值減1隧膘;如果desema的值為0,那么這個函數就阻塞當前線程等待timeout(注意timeout的類型為dispatch_time_t寺惫,不能直接傳入整形或float型數)疹吃,如果等待的期間desema的值被dispatch_semaphore_signal函數加1了,且該函數(即dispatch_semaphore_wait)所處線程獲得了信號量西雀,那么就繼續(xù)向下執(zhí)行并將信號量減1萨驶。如果等待期間沒有獲取到信號量或者信號量的值一直為0,那么等到timeout時艇肴,其所處線程自動執(zhí)行其后語句腔呜。
這里舉個例子,多個數據上傳阿里云成功后再悼,上傳服務器進行數據單條數據存儲核畴;
__block BOOL isFailed = NO;
dispatch_semaphore_t sem = dispatch_semaphore_create(0); //當前信號量為0
[[UploadRecordCenter new]uploadImage:idNum withFileName:fileName success:^{
dispatch_semaphore_signal(sem);//信號量+1
} failure:^(NSString * _Nonnull errorMsg) {
dispatch_semaphore_signal(sem);//信號量+1
isFailed = YES;
}];
[[UploadRecordCenter new]uploadMP3:idNum withFileName:fileName success:^{
dispatch_semaphore_signal(sem);//信號量+1
} failure:^(NSString * _Nonnull errorMsg) {
dispatch_semaphore_signal(sem);//信號量+1
isFailed = YES;
}];
[[UploadRecordCenter new]uploadBRD:idNum withFileName:fileName success:^{
dispatch_semaphore_signal(sem);//信號量+1
} failure:^(NSString * _Nonnull errorMsg) {
dispatch_semaphore_signal(sem);//信號量+1
isFailed = YES;
}];;
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);//信號量-1,此時為-1,需要上面完成一個請求冲九,信號量變?yōu)?谤草,進行下面的操作;
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);//信號量-1莺奸,
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);//信號量-1
//上面3次請求都完成后進行下面的請求操作丑孩;
if (isFailed) {
NSLog(@"上傳失敗");
return ;
}
[[UploadRecordCenter new]uploadToServer:idNum success:^{
NSLog(@"上傳成功");
} failure:^(NSString * _Nonnull errorMsg) {
NSLog(@"上傳失敗");
}];
由于create方法的參數必須>=0,所以上面需要完成多少個請求,就需要寫幾個wait方法;