iOS信号量-dispatch_semaphore

来源:互联网 发布:手机sql注入工具 编辑:程序博客网 时间:2024/05/16 14:15
    __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,这时候开始取值。

0 0
原创粉丝点击