iOS 信號量dispatch_semaphore_的用法

多線程信號量,可以在多線程下控制多線程的并發(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方法;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末灭贷,一起剝皮案震驚了整個濱河市温学,隨后出現的幾起案子,更是在濱河造成了極大的恐慌氧腰,老刑警劉巖枫浙,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刨肃,死亡現場離奇詭異,居然都是意外死亡箩帚,警方通過查閱死者的電腦和手機真友,發(fā)現死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來紧帕,“玉大人盔然,你說我怎么就攤上這事∈鞘龋” “怎么了愈案?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鹅搪。 經常有香客問我站绪,道長,這世上最難降的妖魔是什么丽柿? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任恢准,我火速辦了婚禮,結果婚禮上甫题,老公的妹妹穿的比我還像新娘馁筐。我一直安慰自己,他們只是感情好坠非,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布敏沉。 她就那樣靜靜地躺著,像睡著了一般炎码。 火紅的嫁衣襯著肌膚如雪盟迟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天辅肾,我揣著相機與錄音队萤,去河邊找鬼轮锥。 笑死矫钓,一個胖子當著我的面吹牛,可吹牛的內容都是我干的舍杜。 我是一名探鬼主播新娜,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼既绩!你這毒婦竟也來了概龄?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤接奈,失蹤者是張志新(化名)和其女友劉穎冲茸,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體定庵,經...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡衰粹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年锣光,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铝耻。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡誊爹,死狀恐怖,靈堂內的尸體忽然破棺而出瓢捉,到底是詐尸還是另有隱情频丘,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布泡态,位于F島的核電站搂漠,受9級特大地震影響,放射性物質發(fā)生泄漏某弦。R本人自食惡果不足惜状答,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刀崖。 院中可真熱鬧惊科,春花似錦、人聲如沸亮钦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜂莉。三九已至蜡娶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間映穗,已是汗流浹背窖张。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚁滋,地道東北人宿接。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像辕录,于是被迫代替她去往敵國和親睦霎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內容