zoukankan      html  css  js  c++  java
  • iOS- dispatch_semaphore和NSOperationQueue并发

    并发:同一个时间内运行多个任务。又叫共行性,是指处理多个同时性活动的能力。

    并行:是指两个并发的任务同时发生。

    并发不一定并行,并发不一定要同时发生。

    举个例子:

    有两个快递分别要送到目的地,有以下两种方案:

    (1)一个快递员分别把两个快递送到对应的目的地。(并发)

    (2)两个快递员同时送一个快递到目的地。(并行)

    在iOS中,经常可以看见有这样的需求,就是一个方法要等另外一个方法执行完毕再做相对应的处理,比如说一些网络请求,需要根据上一个请求的返回值做相对应的处理再执行第二个请求,所以我们不能让两个请求同时去请求网络。下面就记录以下通过GCD和NSOperationQueue来控制并发。

    dispatch_semaphore

    信号量是一个整型值并且具有初始计数值,信号量通常支持两个操作:通知和等待。当信号被通知的时候计数值会增加,当信号量在线程上等待的时候,必要的情况下线程会被阻塞掉,直至信号被通知时计数值大于0,然后线程会减少这个计数继续工作。

    GCD中又3个信号量有关的操作:

    dispatch_semaphore_create    信号量创建

    dispatch_semaphore_signal    发送通知

    dispatch_semaphore_wait     信号量等待

        __block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
        dispatch_queue_t queue = dispatch_queue_create("testBlock", NULL);
        dispatch_async(queue, ^{
            
            for (int i = 0 ; i < 100; i++) {
                NSLog(@"i的值是:%d",i);
            }
            
            dispatch_semaphore_signal(sem);
        });
        
        dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
        for (int j = 0; j < 10; j ++) {
            NSLog(@"j的值是:%d",j);
        }

    运行结果是:

    NSOperationQueue

    在不添加依赖的情况下:

        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        queue.maxConcurrentOperationCount = 10;
        
        NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
            
            for (int i = 0; i < 1000; i++) {
                
                NSLog(@"执行并发队列1:%d",i);
            }
        }];
        
        NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){
            
            for (int i = 0; i < 1500; i++) {
                
                NSLog(@"执行并发队列2:%d",i);
            }
        }];
        
        
        [queue addOperation:operation1];
        [queue addOperation:operation2];

    运行结果:

    两个NSOperation是并发打印的。

    添加依赖控制后:

        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        queue.maxConcurrentOperationCount = 10;
        
        NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
            
            for (int i = 0; i < 1000; i++) {
                
                NSLog(@"执行并发队列1:%d",i);
            }
        }];
        
        NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){
            
            for (int i = 0; i < 1500; i++) {
                
                NSLog(@"执行并发队列2:%d",i);
            }
        }];
        
        
        
        [operation1 addDependency:operation2];   //添加依赖,operation1要依赖operation2才能继续执行
        
        [queue addOperation:operation1];
        [queue addOperation:operation2];

    打印的结果:

  • 相关阅读:
    Java 读写Properties配置文件【转】
    leetcode_回文数
    leetcode_整数反转
    leetcode_两数之和
    DVWA_XSS(DOM)
    DVWA_File Upload 文件上传 抓包改包传木马 图片马的制作 Impossible的代码审计
    DVWA_File Inclusion 文件包含 远程文件包含拿webshell
    DVWA_Command Injection 命令注入
    bugku_本地包含
    sqli-labs-master-Less-5 基于聚合分组函数报错的双注入(盲注手注)还有一种基于溢出的报错双注入要整理
  • 原文地址:https://www.cnblogs.com/iOS-dd/p/3927662.html
Copyright © 2011-2022 走看看