最近項(xiàng)目中有個(gè)需求,獲取相冊的照片上傳到服務(wù)器。但是在PHAsset轉(zhuǎn)化為image是個(gè)block,所以必須做同步,直到PHAsset轉(zhuǎn)化為image后才可以拿到圖片去上傳。所以用的信號量去解決的問題。
//將asset轉(zhuǎn)換為image
-(UIImage *)getImageWithAsset:(PHAsset *)asset targetSize:(CGSize)targetSize {
PHImageManager *manager = [PHImageManager defaultManager];
PHImageRequestOptions *options;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
__block UIImage * image1;
[manager requestImageForAsset:asset targetSize:targetSize contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage *resultImage, NSDictionary *info)
{
image1 = resultImage;
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
return image1;
}
關(guān)于信號量的一些知識。
信號量是一個(gè)整形值并且具有一個(gè)初始計(jì)數(shù)值,并且支持兩個(gè)操作:信號通知和等待。當(dāng)一個(gè)信號量被信號通知,其計(jì)數(shù)會被增加。當(dāng)一個(gè)線程在一個(gè)信號量上等待時(shí),線程會被阻塞(如果有必要的話),直至計(jì)數(shù)器大于零,然后線程會減少這個(gè)計(jì)數(shù)。
- 在GCD中有三個(gè)函數(shù)是semaphore的操作,分別是
dispatch_semaphore_create 創(chuàng)建一個(gè)semaphore
dispatch_semaphore_signal 發(fā)送一個(gè)信號
dispatch_semaphore_wait 等待信號
- 三個(gè)函數(shù)介紹:
第一個(gè)函數(shù):創(chuàng)建一個(gè)整形數(shù)值的信號,即:信號的總量
dispatch_semaphore_create的聲明為:
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
傳入的參數(shù)為long,這里的傳入的參數(shù)value必須大于或等于0,否則dispatch_semaphore_create會返回NULL。
輸出一個(gè)dispatch_semaphore_t類型且值為value的信號量。
第二個(gè)函數(shù):發(fā)送一個(gè)信號,讓信號總量增加1
dispatch_semaphore_signal(semaphore)
第三個(gè)函數(shù):首先判斷信號量是否大于零,如果大于零則減掉1個(gè)信號量,往下執(zhí)行,如果等于零則阻塞該線程。
// DISPATCH_TIME_NOW(現(xiàn)在) 和 DISPATCH_TIME_FOREVER(永遠(yuǎn))
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
關(guān)于信號量,一般可以用停車來比喻。
停車場剩余4個(gè)車位,那么即使同時(shí)來了四輛車也能停的下。如果此時(shí)來了五輛車,那么就有一輛需要等待。信號量的值就相當(dāng)于剩余車位的數(shù)目,dispatch_semaphore_wait函數(shù)就相當(dāng)于來了一輛車,dispatch_semaphore_signal就相當(dāng)于走了一輛車。停車位的剩余數(shù)目在初始化的時(shí)候就已經(jīng)指明(dispatch_semaphore_create(long value))。
調(diào)用一次dispatch_semaphore_signal,剩余的車位就增加一個(gè);
調(diào)用一次dispatch_semaphore_wait剩余車位就減少一個(gè);
當(dāng)剩余車位為0時(shí),再來車(即調(diào)用dispatch_semaphore_wait)就只能等待。有可能同時(shí)有幾輛車等待一個(gè)停車位。有些車主沒有耐心,給自己設(shè)定了一段等待時(shí)間,這段時(shí)間內(nèi)等不到停車位就走了,如果等到了就開進(jìn)去停車。而有些車主就像把車停在這,所以就一直等下去。