iOS 关于dispatch_semaphore_t 同步执行

2018-04-17  本文已影响68人  coco_CC

前言

方法以及作用:当我们在编辑项目时遇到网络请求或者开启子线程执行时,线程和请求之外的逻辑需要等待它执行完才可以执行,这时用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;
}
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
)
上一篇下一篇

猜你喜欢

热点阅读