Block
是編程語(yǔ)言層的特質(zhì),它允許你保存一段代碼痢畜,在合適的使用取出來(lái)調(diào)用垛膝。如果對(duì)Block不夠了解,請(qǐng)另查閱相關(guān)資料丁稀,本文章不對(duì)Block做解釋吼拥。Grand Central Dispatch
簡(jiǎn)稱(GCD)是Apple公司開發(fā)的技術(shù),相比NSThread或NSOperation使用方便,并且優(yōu)點(diǎn)是當(dāng)處理器為多核時(shí)能利用多核的特征來(lái)創(chuàng)建線程二驰。它首次發(fā)布在Mac OS X 10.6 扔罪,iOS 4及以上也可用。我們知道GCD桶雀,但怎么在Block中使用它呢矿酵?答案是
dispatch semaphore
唬复。需要了解信號(hào)量的create
、signal
和wait
全肮。
1. dispatch_semaphore_create => 創(chuàng)建一個(gè)信號(hào)量的初始值
傳入的參數(shù)為long敞咧,輸出一個(gè)dispatch_semaphore_t類型且值為value的信號(hào)量。
值得注意的是辜腺,這里的傳入的參數(shù)value必須大于或等于0休建,否則dispatch_semaphore_create會(huì)返回NULL。
2. dispatch_semaphore_signal => 發(fā)送一個(gè)信號(hào)
這個(gè)函數(shù)會(huì)使傳入的信號(hào)量dsema的值加1评疗。
返回值為long類型测砂,當(dāng)返回值為0時(shí)表示當(dāng)前并沒有線程等待其處理的信號(hào)量,其處理的信號(hào)量的值加1即可百匆。
當(dāng)返回值不為0時(shí)砌些,表示其當(dāng)前有(一個(gè)或多個(gè))線程等待其處理的信號(hào)量,并且該函數(shù)喚醒了一個(gè)等待的線程(當(dāng)線程有優(yōu)先級(jí)時(shí)加匈,喚醒優(yōu)先級(jí)最高的線程存璃;否則隨機(jī)喚醒)。
3. dispatch_semaphore_wait => 等待一個(gè)信號(hào)
這個(gè)函數(shù)會(huì)使傳入的信號(hào)量dsema的值減1雕拼;
如果dsema信號(hào)量的值大于0纵东,該函數(shù)所處線程就繼續(xù)執(zhí)行下面的語(yǔ)句,并且將信號(hào)量的值減1啥寇;
如果desema的值為0偎球,那么這個(gè)函數(shù)就阻塞當(dāng)前線程等待timeout(注意timeout的類型為dispatch_time_t,
不能直接傳入整形或float型數(shù))示姿,如果等待的期間desema的值被dispatch_semaphore_signal函數(shù)加1了甜橱,
且該函數(shù)(即dispatch_semaphore_wait)所處線程獲得了信號(hào)量,那么就繼續(xù)向下執(zhí)行并將信號(hào)量減1栈戳。
如果等待期間沒有獲取到信號(hào)量或者信號(hào)量的值一直為0岂傲,那么等到timeout時(shí),其所處線程自動(dòng)執(zhí)行其后語(yǔ)句子檀。
4. timeout
在設(shè)置timeout時(shí)镊掖,比較有用的兩個(gè)宏:
DISPATCH_TIME_NOW 表示當(dāng)前;
DISPATCH_TIME_FOREVER 表示未來(lái)褂痰;
一般可以直接設(shè)置timeout為這兩個(gè)宏其中的一個(gè)亩进,或者自己創(chuàng)建一個(gè)dispatch_time_t類型的變量。
創(chuàng)建dispatch_time_t類型的變量有兩種方法缩歪,dispatch_time和dispatch_walltime归薛。
利用創(chuàng)建dispatch_time創(chuàng)建dispatch_time_t類型變量的時(shí)候一般也會(huì)用到這兩個(gè)變量。
dispatch_time的聲明如下:
dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta);
其參數(shù)when需傳入一個(gè)dispatch_time_t類型的變量主籍,和一個(gè)delta值习贫。表示when加delta時(shí)間就是timeout的時(shí)間。
例如:
dispatch_time_t t = dispatch_time(DISPATCH_TIME_NOW, 110001000*1000);
表示當(dāng)前時(shí)間向后延時(shí)一秒為timeout的時(shí)間千元。
- 現(xiàn)在我們使用
dispatch semaphore
去實(shí)現(xiàn)等待Block
操作結(jié)束苫昌。 - 單個(gè)Block:
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
[self methodWithABlock:^(id result){
//寫block中做的事情
//結(jié)束等待
dispatch_semaphore_signal(sem);
}];
//等待信號(hào)
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
- 多個(gè)Block:
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
[self methodWithABlock:^(id result){
//寫block中做的事情
dispatch_semaphore_signal(sem);
}];
[self methodWithABlock:^(id result){
//寫block中做的事情
dispatch_semaphore_signal(sem);
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
- Block中的Block
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
[self methodWithABlock:^(id result){
//寫block中做的事情
dispatch_semaphore_signal(sem);
[self methodWithABlock:^(id result){
//寫block中做的事情
dispatch_semaphore_signal(sem);
}];
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
如果文章對(duì)你有幫助,請(qǐng)點(diǎn)下“喜歡”吧幸海,感謝祟身!
參考文獻(xiàn):
關(guān)于dispatch_semaphore的使用
Wait for blocks execution using a dispatch semaphore
How Do I Declare A Block in Objective-C ?