GCD多线程

2017-05-29  本文已影响0人  AsABurger

系统提供的dispatch方法

   //后台执行:
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //something
    });
    
    //主线程执行:
    dispatch_async(dispatch_get_main_queue(),^{
       //something
    });
    //一次性执行:
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
        //code to be executed once
    });
    //延迟两秒执行
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^{
        //code to excuted on the main queue after delay
    });

自定义一个dispatch_queue_t

dispatch_queue_t urls_queue = dispatch_queue_create("queueName", NULL);
    dispatch_async(urls_queue, ^{
        //your code
    });
//    dispatch_release(urls_queue);

让后台两个线程并行执行,等待两个线程都结束后,再汇总执行结果

    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        //并行执行的线程一
    });
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        //并行执行的线程二
    });
    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        //当一二执行完后执行的结果
    });

修改block之外的变量

默认情况下,block中访问的外部变量是复制过去的,写操作不会对原变量生效。在变量前加__block可让写操作生效。

    __block int a = 0;
    void (^foo)(void) = ^{
        a = 1;
    };
    foo();

以上内容整理自唐巧的《iOS开发进阶》一书

声明一个带有返回值和参数的block

    int (^func)(int,int) = ^(int a,int b){
        a = a + b;
        return a;
    };
    int b = func(3,4);
上一篇下一篇

猜你喜欢

热点阅读