系統(tǒng)API block方法如何轉(zhuǎn)化為同步操作獲取返回結(jié)果
在程序開發(fā)中,有時候我們不想使用異步方式挽懦,例如我們想要調(diào)用函數(shù)后立刻獲取結(jié)果值的時候抗果,然后進行后續(xù)的數(shù)據(jù)操作。
這個時候需要信號量來等待返回結(jié)果,然后等到結(jié)果返回挺尿,從而進行后續(xù)處理聋庵。
假設(shè)現(xiàn)在程序需要上傳五張圖片到七牛服務(wù)端,為了保證圖片的上傳成功腊凶,我們需要對獲取到相冊中的圖片進行壓縮處理划咐,然后上傳到七牛。
[ImageManagerCenter shareManager].upLoadImageCount = assetsArray.count;
NSMutableArray *imageStoreArray = [[NSMutableArray alloc]init];
//創(chuàng)建信號量
GCDSemaphore *semaphore = [GCDSemaphore new];
GCDSemaphore *imageToDatasemaphore = [GCDSemaphore new];
WEAKSELF
for (JKAssets *jkasset in assetsArray) {
ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init];
[lib assetForURL:jkasset.assetPropertyURL resultBlock:^(ALAsset *asset){
UIImage *image = [ImageManagerCenter fullResolutionImageFromALAsset:asset];
[imageStoreArray addObject:image];
if (imageStoreArray.count == assetsArray.count) {
//發(fā)送信號
[imageToDatasemaphore signal];
}
}failureBlock:^(NSError *error){
//發(fā)送信號
[semaphore signal];
}];
}
[GCDQueue executeInGlobalQueue:^{
[imageToDatasemaphore wait];
//等待數(shù)據(jù)之后
[GCDQueue executeInGlobalQueue:^{
NSData *imageData;
NSMutableArray *dataPicArray = [[NSMutableArray alloc]init];
for (UIImage *image in imageStoreArray) {
imageData = UIImageJPEGRepresentation(image, 0.3);
[dataPicArray addObject:imageData];
}
weakSelf.dataArray = dataPicArray;
//通過信號量控制異步操作
[semaphore signal];
}];
}];
// wait
[GCDQueue executeInGlobalQueue:^{
//等待信號源
[semaphore wait];
[weakSelf loadAssetImage:weakSelf.dataArray];
}];
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者