系統API block方法如何轉化為同步操作獲取返回結果
在程序開發中,有時候我們不想使用異步方式,例如我們想要調用函數后立刻獲取結果值的時候,然后進行后續的數據操作。
這個時候需要信號量來等待返回結果,然后等到結果返回,從而進行后續處理。
假設現在程序需要上傳五張圖片到七牛服務端,為了保證圖片的上傳成功,我們需要對獲取到相冊中的圖片進行壓縮處理,然后上傳到七牛。
[ImageManagerCenter shareManager].upLoadImageCount = assetsArray.count;
NSMutableArray *imageStoreArray = [[NSMutableArray alloc]init];
//創建信號量
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) {
//發送信號
[imageToDatasemaphore signal];
}
}failureBlock:^(NSError *error){
//發送信號
[semaphore signal];
}];
}
[GCDQueue executeInGlobalQueue:^{
[imageToDatasemaphore wait];
//等待數據之后
[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];
}];