__block NSString *strD ;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"循环/取值-1---%@",[NSThread currentThread]);
for (int i = 0; i<10; i++) {
strD = [NSString stringWithFormat:@"%d",i];
NSLog(@"strD---1---%@",strD);
}
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"循环/取值-2---%@",[NSThread currentThread]);
if (strD ==nil ) {
NSLog(@"取不到值啊!!!===%@",strD);
}else{
NSLog(@"取到了strD===%@",strD);
}
});
如果在第二个线程中必须取到值,用异步并发,会出现很多情况,有可能取到值,也有可能取到空。
有没有能直接取到值的方法呢!
答案是一定有的,那就是dispatch_semaphore
不多说直接上代码
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
__block NSString *strD ;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"循环/取值-1---%@",[NSThread currentThread]);
for (int i = 0; i<10; i++) {
strD = [NSString stringWithFormat:@"%d",i];
NSLog(@"strD---1---%@",strD);
dispatch_semaphore_signal(semaphore);
}
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"循环/取值-2---%@",[NSThread currentThread]);
if (strD ==nil ) {
NSLog(@"取不到值啊!!!===%@",strD);
}else{
NSLog(@"取到了strD===%@",strD);
}
});
dispatch_semaphore_create(0) 初始值为0, dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
会一直等待,当for循环执行的时候 dispatch_semaphore_signal(semaphore);
发送一条信号,值变1,这时候开始取值。