dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); // 创建信号量
NSMutableArray* integralURLs = [NSMutableArrayarray];
for(NSString* objectKeyincallBackNames) {
[selfgetIntegralURLStringByObjectKey:objectKey
success:^(NSString*integralURL) {
[integralURLsaddObj:integralURL];
dispatch_semaphore_signal(semaphore);// block中发送
}];
}
NSLog(@"upload object finished!");
//等待信号
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);//外部等待
XLsn0wLog(@"integralURLs = %@", integralURLs);
if(success) {
success([NSArrayarrayWithArray:callBackNames],
[NSArrayarrayWithArray:integralURLs]);
}
}
在GCD中有三个函数是semaphore的操作,分别是
dispatch_semaphore_create 创建一个semaphore
dispatch_semaphore_signal 发送一个信号
dispatch_semaphore_wait 等待信号
三个函数介绍:
第一个函数:创建一个整形数值的信号,即:信号的总量
dispatch_semaphore_create的声明为:
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
传入的参数为long,这里的传入的参数value必须大于或等于0,否则dispatch_semaphore_create会返回NULL。
输出一个dispatch_semaphore_t类型且值为value的信号量。
第二个函数:发送一个信号,让信号总量增加1
dispatch_semaphore_signal(semaphore)
第三个函数:首先判断信号量是否大于零,如果大于零则减掉1个信号量,往下执行,如果等于零则阻塞该线程。