美文网首页
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