iOS GCD的信号量操作dispatch_semaphore_t

    信号量实现异步线程的同步操作,开发过程中需要几个异步的操作都完成之后再执行下一个操作,信号量是比较好的选择,它是线程阻塞的.比如等所有的数据都准备完成之后再展示画面,在请求的过程中展示loading.
    敲黑板,先来介绍一下dispatch_semaphore_t的几个函数.
    dispatch_semaphore_t sem = dispatch_semaphore_create(0); 创建信号量.
    dispatch_semaphore_signal(sem); 信号量+1
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); 信号量-1
    遇到dispatch_semaphore_wait如果信号量的值小于0,就一直阻塞线程,不执行后面的所有程序,直到信号量大于等于0;

    //创建信号量 初始值为0
    long semNum = 0;
    dispatch_semaphore_t sem = dispatch_semaphore_create(semNum);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:downUrl]];
            if (data) {
                //遇到single 信号量 加1 信号量值为 0 ,线程阻塞解除
                dispatch_semaphore_signal(sem);
            }
        });
      //等待 遇到waint 减1,信号量的值为-1,一直等待
      dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
      //等待完成
      }

你可能感兴趣的:(iOS GCD的信号量操作dispatch_semaphore_t)