美文网首页
iOS 关于dispatch_semaphore_t 同步执行

iOS 关于dispatch_semaphore_t 同步执行

作者: coco_CC | 来源:发表于2018-04-17 12:30 被阅读68次

前言

方法以及作用:当我们在编辑项目时遇到网络请求或者开启子线程执行时,线程和请求之外的逻辑需要等待它执行完才可以执行,这时用dispatch_semaphore_t可以满足需求。

dispatch_semaphore_t 用法

//创建信号
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
//发射信号
dispatch_semaphore_signal(sema);
//等待信号
dispatch_semaphore_wait(sema, 1.0);

使用信号量 dispatch_semaphore_t 控制请求

- (NSArray  *)p_upData{

        //存放数据
    NSMutableArray * array = [NSMutableArray arrayWithCapacity:0];
        //替代我们平时常用的异步网络请求
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        for (int i=0; i<10; i++) {
            [array addObject:[NSNumber numberWithInt:i]];
        }
        NSLog(@"array = %@",array);

    });

    return array;
}

输出下上面的方法

 NSArray  * dataArray = [self p_upData];
 NSLog(@"dataArray = %@",dataArray);
2018-04-17 10:30:45.868 HTMITest dataArray = (
)
2018-04-17 10:30:45.875 HTMITest array = (
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9
)

想要的结果没有输出,但是查看这个数组他肯定有值。

  • 现在我们把上述方法修改下,使用信号量控制,再来看看结果
- (NSArray  *)p_upData{

        //修改下面的代码,使用信号量来进行一个同步数据
        //我们传入一个参数0 ,表示没有资源,非0 表示是有资源,这一点需要搞清楚  
//这里的整形参数如果是非0 就是总资源
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);

        //假如下面这个数组是用来存放数据的
    NSMutableArray * array = [NSMutableArray arrayWithCapacity:0];
        //下面这个来代替我们平时常用的异步网络请求
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        for (int i=0; i<10; i++) {

            [array addObject:[NSNumber numberWithInt:i]];
        }
        NSLog(@"array = %@",array);

        dispatch_semaphore_signal(sema);
    });
    //信号等待 时,资源数 -1  阻塞当前线程 
    dispatch_semaphore_wait(sema, 1.0);
    
    return array;
}
  • 信号量的理解:
    我们初始化的时候会先设置一个信号总量,如果信号总量的整形参数是0 ,那么就是没有资源需要等待,我们如果下面执行wait 操作,那么相当于线程拥堵,执行信号-1 操作
  • 再次看下控制台的输出:
2018-04-17 10:36:17.361 HTMITest array = (
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9
)
2018-04-17 10:36:17.364 HTMITest resultArrsy = (
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9
)

相关文章

网友评论

      本文标题:iOS 关于dispatch_semaphore_t 同步执行

      本文链接:https://www.haomeiwen.com/subject/jemukftx.html