GCD

http://blog.csdn.net/wang631106979/article/details/51788622 

https://developer.apple.com/documentation/dispatch#//apple_ref/c/func/dispatch_async

- (void)testTargetQueue {

    //1.创建目标队列

    dispatch_queue_t targetQueue = dispatch_queue_create("test.target.queue", DISPATCH_QUEUE_SERIAL);

    //2.创建3个串行队列

    dispatch_queue_t queue1 = dispatch_queue_create("test.1", DISPATCH_QUEUE_SERIAL);

    dispatch_queue_t queue2 = dispatch_queue_create("test.2", DISPATCH_QUEUE_SERIAL);

    dispatch_queue_t queue3 = dispatch_queue_create("test.3", DISPATCH_QUEUE_SERIAL);

    //3.将3个串行队列分别添加到目标队列

    dispatch_set_target_queue(queue1, targetQueue);

    dispatch_set_target_queue(queue2, targetQueue);

    dispatch_set_target_queue(queue3, targetQueue);

    dispatch_async(queue1, ^{

        NSLog(@"1 in");

        [NSThread sleepForTimeInterval:3.f];

        NSLog(@"1 out");

    });

    dispatch_async(queue2, ^{

        NSLog(@"2 in");

        [NSThread sleepForTimeInterval:2.f];

        NSLog(@"2 out");

    });

    dispatch_async(queue3, ^{

        NSLog(@"3 in");

        [NSThread sleepForTimeInterval:1.f];

        NSLog(@"3 out");

    });

}

- (void)run{

    for (int i = 0; i < 2; ++i) {

        NSLog(@"2-----%@", [NSThread currentThread]);

    }

}

- (void)dispatchTest1{

    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, globalQueue, ^{

        int a = 10;

        while (a != 0) {

            a --;

        }

        NSLog(@"111111 %@",[NSThread currentThread]);

    });

    dispatch_group_async(group, globalQueue, ^{

        NSLog(@"2222222 %@",[NSThread currentThread]);

    });

    dispatch_group_async(group, globalQueue, ^{

        NSLog(@"3333333 %@",[NSThread currentThread]);

    });

//    dispatch_group_notify(group, globalQueue, ^{

//        NSLog(@"group Exeture End %@",[NSThread currentThread]);

//    });

    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    NSLog(@"------------%@",[NSThread currentThread]);

}

- (void)dispatchTest2{

//    我们知道多线程开发最难的就是执行顺序的控制,苹果已经给我们封装好了一些流控制的东西,像dispatch_group,等但是有时候某些场景还是需要我们自己实现对代码执行的控制,毕竟我们不希望自己写的代码自己都不知道执行顺序,dispatch_semaphore就是为了这个目的而存在的,我们可以设置一个cout来控制程序按照我们的意愿来执行。

//    注意:对于这样的阻塞线程的操作,最好不要放在主线程,除非特殊要求。我觉得这应该是我们用多线程开发的共识了。

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_queue_t customSerialQueue = dispatch_queue_create("kongqingyu", DISPATCH_QUEUE_SERIAL);

    dispatch_async(globalQueue, ^{

        dispatch_sync(customSerialQueue, ^{

            [NSThread sleepForTimeInterval:0.1];

            NSLog(@"-----------信号即将发送--------");

            dispatch_semaphore_signal(semaphore);

        });

    });

    NSLog(@"---------------wait----------");

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    NSLog(@"----------wait end----------");

    dispatch_async(globalQueue, ^{

        dispatch_sync(customSerialQueue, ^{

            [NSThread sleepForTimeInterval:0.1];

            NSLog(@"-----------信号即将发送--------");

            dispatch_semaphore_signal(semaphore);

        });

    });

    NSLog(@"---------------wait----------");

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    NSLog(@"----------wait end----------");

//    dispatch_release(semaphore);

}

-(void)dispatchSignal{

    //crate的value表示,最多几个资源可访问

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);

    dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    //任务1

    dispatch_async(quene, ^{

        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

        NSLog(@"run task 1");

        sleep(1);

        NSLog(@"complete task 1");

        dispatch_semaphore_signal(semaphore);

    });

    //任务2

    dispatch_async(quene, ^{

        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

        NSLog(@"run task 2");

        sleep(1);

        NSLog(@"complete task 2");

        dispatch_semaphore_signal(semaphore);

    });

    //任务3

    dispatch_async(quene, ^{

        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

        NSLog(@"run task 3");

        sleep(1);

        NSLog(@"complete task 3");

        dispatch_semaphore_signal(semaphore);

    });

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

/**

1、dispatch_queue_t 队列

    (1) 队列的创建 dispatch_queue_create()

    dispatch_queue_create(const char *_Nullable label,

  dispatch_queue_attr_t _Nullable attr); //第一个参数:队列的名称

    第二个参数:若是Serial Dispatch Queue 可为NULL/DISPATCH_QUEUE_SERIAL。若为ConCurrent Dispatch Queue,则指定为 DISPATCH_QUEUE_CONCURRENT

    通过dispatch_queue_create() 创建的队列使用与默认优先级Global Dispatch Queue 相同执行优先级的线程。

    (2)获取系统标准提供的 Dispatch Queue

        串行(主线程):    dispatch_get_main_queue()

        并行: dispatch_get_global_queue() //有多种执行优先级

2、dispatch_set_target_queue

    修改队列的优先级,通过create创建的队列,优先级 与 Global Dispatch Queue的默认优先级 一样。可以通过 dispatch_set_target_queue 方法修改 create 创建队列的优先级。

3、dispatch_after 在 (一段时间)后 将指定的 Block 追加到(指定的)队列中来。

4、dispatch_group

    使用Concurrent Dispatch Queue时或者同时使用多个Dispatch Queue 时没在多个处理全部结束时后执行结束处理。

*/

你可能感兴趣的:(GCD)