zoukankan      html  css  js  c++  java
  • GCD 个人理解

    1.三种队列:main_queue、全局队列、用户队列
    2.向队列派发任务块:
        dispatch_sync  //同步阻塞当前的执行流程、线程
        dispatch_async //不阻塞
        Ios中使用更多是异步任务(不阻塞UI线程的任务)
    3.队列中任务快的执行顺序可靠group操作
    4.底层特定事件监听及相应dispatch source

    - (IBAction)click:(id)sender {
        dispatch_queue_t global_queue_high = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
        dispatch_queue_t global_queue_default = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_queue_t global_queue_low = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
        dispatch_queue_t global_queue_bg = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
        NSLog(@"%@",global_queue_high);
        NSLog(@"%@",global_queue_default);
        NSLog(@"%@",global_queue_low);
        NSLog(@"%@",global_queue_bg);
        
        系统默认提供四种全局并发队列,即四个优先级;但这里所说的优先级并不是说优先级高的队列中的任务就一定比优先级低的队列中的任务先执行
        这不是绝对的,个人理解这个优先级可能是在系统资源紧张时,各个待运行的任务之间,哪个任务所在队列优先级高可能就先执行,在资源充足的
        情况下是各自运行各自的
        而且同一个全局并发队列里的各个任务之间也是并发执行,任务的执行先后顺序都不确定的


    //    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    //        sleep(8);
    //        NSLog(@"DISPATCH_QUEUE_PRIORITY_HIGH");
    //    });
        
    //    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //       NSLog(@"======");
    //        sleep(5);
    //    NSLog(@"11111111");
    //        sleep(3);
    //        NSLog(@"####");
    //    });
    //
    //    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    //        sleep(1);
    //        NSLog(@"DISPATCH_QUEUE_PRIORITY_LOW");
    //    });
    //    
    //    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    //        sleep(2);
    //        NSLog(@"DISPATCH_QUEUE_PRIORITY_BACKGROUND");
    //    });
        
        //自定义队列,串行和并发,,只有串行队列中的任务才是先进先出(FIFO)的模式
    //    customerQueue = dispatch_queue_create("com.example.myQueue", DISPATCH_QUEUE_SERIAL);
    //    dispatch_async(customerQueue, ^{
    //        NSLog(@"11111");
    //        sleep(3);
    //        NSLog(@"rrrrr");
    //    });
        //dispatch_barrier_async的使用
        //dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行(可做一些多任务间的加锁、同步锁、类似于串行队列的功能)
        //只能对用户队列且是并行的队列才有用,全局队列不起效

        dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);
        
    //    dispatch_async(queue, ^{
    //        
    //        [NSThread sleepForTimeInterval:2];
    //        
    //        NSLog(@"dispatch_async1");
    //        
    //    });
    //    
    //    dispatch_async(queue, ^{
    //        
    //        [NSThread sleepForTimeInterval:4];
    //        
    //        NSLog(@"dispatch_async2");
    //        
    //    });
        
        dispatch_barrier_async(queue, ^{
            
            NSLog(@"dispatch_barrier_async");
            
            [NSThread sleepForTimeInterval:4];
            
            NSLog(@"dispatch_barrier_async111");
            
            
        });
        
        dispatch_async(queue, ^{
            sleep(2);
            NSLog(@"dispatch_async3");
            
        });
        
        dispatch_async(queue, ^{
            sleep(5);
            NSLog(@"dispatch_asyncwww");
        });
        
    //    dispatch_group_t group = dispatch_group_create();
    //    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //        NSLog(@"first start");
    //        sleep(3);
    //        NSLog(@"fisrt end");
    //    });
    //    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //        NSLog(@"second start");
    //        sleep(3);
    //        NSLog(@"second end");
    //    });
    //    dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //        NSLog(@"notify");
    //    });
        
        //dispatch_group_wait(group, DISPATCH_TIME_FOREVER); //简单的采用wait监听整个组中的任务则会阻塞UI线程,dispatch_group_notify方式不会

        //1.如果工程target版本低于 iOS 6.0 or Mac OS X 10.8,则需自己管理GCD对象,使用(dispatch_retain,dispatch_release),不管MRC还是ARC都要手动管理
        //2.是 iOS 6.0 or Mac OS X 10.8 或者更高的,ARC已经能够管理GCD对象了,这时候,GCD对象就如同普通的OC对象一样,不应该使用dispatch_retain ordispatch_release

        //dispatch_release(group);

    //    dispatch_source_merge_data
    //    dispatch_source_t costomerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_WRITE,
  • 相关阅读:
    0505.Net基础班第十四天(winform基础)
    0505.Net基础班第十三天(面向对象多态)
    Z-index
    div的padding和margin
    隐藏div,文本框角圆滑,消除外边框
    页面加载完成之后运行方法里的内容,隐藏标签,判断字符串里面是否包含某个字符
    CSS命令
    漂浮
    电子时钟
    用二维数组存数据(学科成绩、总分以及平均值)
  • 原文地址:https://www.cnblogs.com/cnsec/p/11515788.html
Copyright © 2011-2022 走看看