iOS多線程——dispatch_semaphore

dispatch_semaphore是GCD中的信號量纤虽,可以處理多線程中線程并發(fā)的問題狡刘,也可以用作同步處理

一襟诸、dispatch_semaphore方法

  • 創(chuàng)建信號量瓦堵,里面的參數(shù)是表示信號的總量,值必須>=0
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

  • 發(fā)送一個信號歌亲,信號量的總數(shù)會+1
    dispatch_semaphore_signal(semaphore);

  • 信號等待菇用,當(dāng)信號量的總數(shù)<=0的時候,會一直等待陷揪,直到信號量的總數(shù)>0的時候才會繼續(xù)下面的執(zhí)行
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

注意:dispatch_semaphore_wait
當(dāng)信號量的總數(shù)<=0時候惋鸥,該函數(shù)所在的線程就會等待,而信號量的總數(shù)>0的時候悍缠,該函數(shù)就會繼續(xù)往下執(zhí)行卦绣,同時信號量的總數(shù)-1
這里有個等待時間的參數(shù),如果在等待的時間內(nèi)獲得了信號量飞蚓,那么函數(shù)繼續(xù)往下執(zhí)行滤港,如果等待時間內(nèi)信號量一直為0,那么函數(shù)也會繼續(xù)往下執(zhí)行了

二趴拧、代碼

實例一:信號量基本用法

- (void)test2 {
    
    //信號量
    
    //創(chuàng)建總數(shù)為10的信號量
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    for (int i = 0; i < 100; i++) {
        
        //這里注意當(dāng)?shù)却龝r間為10和1的線程的區(qū)別
        dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 10);
        //信號量總數(shù)>0溅漾,繼續(xù)執(zhí)行,否則等待
        dispatch_semaphore_wait(semaphore, time);
        
        dispatch_async(queue, ^{
            
            NSLog(@"%i~~~~~%@",i, [NSThread currentThread]);
            
            sleep(3);
            
            //發(fā)送信號八堡,信號量總數(shù)+1
            dispatch_semaphore_signal(semaphore);
        });
    }
}

實例二:使用NSURLSession同步請求(使用信號量)

- (void)test3 {
    
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:@"http://imgsrc.baidu.com/forum/w%3D580/sign=16ccb289970a304e5222a0f2e1caa7c3/4ee3cc5c10385343102141ac9313b07ec880889f.jpg"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
    
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    
    NSURLSessionTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        NSLog(@"~~~~~~下載完成了呢");
        
        //發(fā)送信號
        dispatch_semaphore_signal(semaphore);
    }];
    
    [dataTask resume];
    
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    NSLog(@"~~~~~~哈哈哈任務(wù)結(jié)束了呢");
}

實例三:使用NSURLSession同步請求(使用group)

- (void)test4 {
    
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:@"http://imgsrc.baidu.com/forum/w%3D580/sign=16ccb289970a304e5222a0f2e1caa7c3/4ee3cc5c10385343102141ac9313b07ec880889f.jpg"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
    
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
    
    //進(jìn)入組
    dispatch_group_enter(group);
    
    dispatch_group_async(group, queue, ^{
        
        NSURLSessionTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            
            NSLog(@"~~~~~~下載完成了呢");
            
            //離開組
            dispatch_group_leave(group);
        }];
        
        [dataTask resume];
        
    });
    
    //等待組內(nèi)的任務(wù)完成
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    NSLog(@"~~~~~~哈哈哈任務(wù)結(jié)束了呢");
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末樟凄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子兄渺,更是在濱河造成了極大的恐慌缝龄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挂谍,死亡現(xiàn)場離奇詭異叔壤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)口叙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門炼绘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人妄田,你說我怎么就攤上這事俺亮⊥院矗” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵脚曾,是天一觀的道長东且。 經(jīng)常有香客問我,道長本讥,這世上最難降的妖魔是什么珊泳? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮拷沸,結(jié)果婚禮上色查,老公的妹妹穿的比我還像新娘。我一直安慰自己撞芍,他們只是感情好秧了,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著序无,像睡著了一般示惊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上愉镰,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音钧汹,去河邊找鬼丈探。 笑死,一個胖子當(dāng)著我的面吹牛拔莱,可吹牛的內(nèi)容都是我干的碗降。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼塘秦,長吁一口氣:“原來是場噩夢啊……” “哼讼渊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尊剔,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤爪幻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后须误,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挨稿,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年京痢,在試婚紗的時候發(fā)現(xiàn)自己被綠了奶甘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡祭椰,死狀恐怖臭家,靈堂內(nèi)的尸體忽然破棺而出疲陕,到底是詐尸還是另有隱情,我是刑警寧澤钉赁,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布蹄殃,位于F島的核電站,受9級特大地震影響橄霉,放射性物質(zhì)發(fā)生泄漏窃爷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一姓蜂、第九天 我趴在偏房一處隱蔽的房頂上張望按厘。 院中可真熱鬧,春花似錦钱慢、人聲如沸逮京。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懒棉。三九已至,卻和暖如春览绿,著一層夾襖步出監(jiān)牢的瞬間策严,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工饿敲, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留妻导,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓怀各,卻偏偏與公主長得像倔韭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瓢对,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容