美文网首页好东西小知识点程序员
信号量(dispatch_semaphore_t)- 实现一个页

信号量(dispatch_semaphore_t)- 实现一个页

作者: icc_tips | 来源:发表于2017-08-11 13:55 被阅读169次

    目标:实现一个页面多个请求

    我们经常遇到这样的情况:例如用户界面的数据展示 里面有多个接口,我们数据请求完成之后展示页面。这时应该怎么办?或者里面的接口一层套一层(比如需要获取用户基本接口的数据,才能获取用户的其他信息)这时我们又该怎么办?基于这样的目的,我们使用来了信号量

    信号量(dispatch_semaphore_t)的介绍(谷歌而来,大家也可以去看看,自己也不是很懂)

    信号量就是一个资源计数器,对信号量有两个操作来达到互斥,分别是P和V操作。 一般情况是这样进行临界访问或互斥访问的: 设信号量值为1, 当一个进程1运行是,使用资源,进行P操作,即对信号量值减1,也就是资源数少了1个。这是信号量值为0。系统中规定当信号量值为0是,必须等待,知道信号量值不为零才能继续操作。 这时如果进程2想要运行,那么也必须进行P操作,但是此时信号量为0,所以无法减1,即不能P操作,也就阻塞。这样就到到了进程1排他访问。 当进程1运行结束后,释放资源,进行V操作。资源数重新加1,这是信号量的值变为1. 这时进程2发现资源数不为0,信号量能进行P操作了,立即执行P操作。信号量值又变为0.次数进程2咱有资源,排他访问资源。 这就是信号量来控制互斥的原理

    主要就是这三个函数: 
    dispatch_semaphore_create 创建一个semaphore 
    dispatch_semaphore_signal 发送一个信号(自然会让信号总量加1)
    dispatch_semaphore_wait 等待信号(当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1)

    实现目标

    1:采用GCD方法

    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self loadUserData];
    }) ;
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self loadBalaceData];
    }) ;
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self loadUserFriendsData];
    }) ;
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    //展示页面
    [self showUserView];
    });

    -(void)request2{
    //创建信号量并设置计数默认为0
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    NSDictionary * para ;//参数 具体部分我就不暴露了
    [WJFCollection postWithUrlString:@"url" Parameter:para success:^(id responseObject) {
    //只要在这里发送信号
    dispatch_semaphore_signal(semaphore);
    } failure:^(NSError *error) {
    //只要在这里发送信号
    dispatch_semaphore_signal(semaphore);
    NSLog(@"%@",error);
    }];
    //若计数为0则一直等待
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    }

    2:采用NSOperationQueue方法

    NSBlockOperation *operation_1 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"1");
    [self loadUserFriendsData];
    }];
    NSBlockOperation *operation_2 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"2");
    [self loadBalaceData];
    }];
    NSBlockOperation *operation_3 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"3");
    [self loadUserData];
    }];
    //设置依赖关系
    [operation_2 addDependency:operation_3];
    [operation_1 addDependency:operation_2];
    //创建队列并添加任务 (这里要设置No)
    NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue addOperations:@[operation_3,operation_2,operation_1] waitUntilFinished:NO];
    //注意这里一定要是No,不然会阻塞线程

    参考的文章:

    http://www.jianshu.com/p/04ca5470f212

    相关文章

      网友评论

        本文标题:信号量(dispatch_semaphore_t)- 实现一个页

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