iOS GCD dispatch_sync 与dispatch_async 区别

dispatch_sync和 dispatch_async需要两个参数,一个是队列,一个是block,它们的共同点是block都会在你指定的队列上执行(无论队列是并行队列还是串行队列),不同的是dispatch_sync会阻塞当前调用GCD的线程直到block结束,而dispatch_async异步继续执行。
如果dispatch_sync 与dispatch_async 同时存在的同步线程会优先运行dispatch_sync 的线程,但是如果dispatch_async创建的是一部线程则不受此影响。
代码如下:

 dispatch_async(dispatch_get_main_queue(), ^{

        sleep(4);

        if ( [NSThread currentThread].isMainThread) {

            NSLog(@"1同步");

        }

        else

        {

            NSLog(@"1异步");

        }

    });

    dispatch_async(dispatch_get_main_queue(), ^{

        sleep(4);

 

        if ([NSThread currentThread].isMainThread) {

            NSLog(@"2同步");

        }

        else

        {

            NSLog(@"2异步");

        }

    });

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        if ([NSThread currentThread].isMainThread) {

            NSLog(@"3同步");

        }

        else

        {

            NSLog(@"3异步");

        }

        dispatch_async(dispatch_get_main_queue(), ^{

            if ([NSThread currentThread].isMainThread) {

                NSLog(@"4主线程同步");

            }

            else

            {

                NSLog(@"4异步");

            }

        });

    });

    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        sleep(4);

        if ([NSThread currentThread].isMainThread)

        {

            NSLog(@"5同步");

        }

        else

        {

            NSLog(@"5异步");

        }

    });

    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        sleep(4);

 

        if ([NSThread currentThread].isMainThread)

        {

            NSLog(@"7同步");

        }

        else

        {

            NSLog(@"7异步");

        }

    });

    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        sleep(4);

 

        if ([NSThread currentThread].isMainThread)

        {

            NSLog(@"8同步");

        }

        else

        {

            NSLog(@"8异步");

        }

    });

    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        sleep(4);

 

        if ([NSThread currentThread].isMainThread)

        {

            NSLog(@"9同步");

        }

        else

        {

            NSLog(@"9异步");

        }

    });

    dispatch_queue_t testQueue = dispatch_queue_create("testsync_gcd", DISPATCH_QUEUE_CONCURRENT);

    dispatch_sync(testQueue, ^{

        sleep(4);

        if ([NSThread currentThread].isMainThread)

        {

            NSLog(@"6同步");

        }

        else

        {

            NSLog(@"6异步");

        }

    });

 

最终的执行顺序

2017-02-16 16:02:31.235 GCD[32197:890408] 3异步

2017-02-16 16:02:35.309 GCD[32197:890372] 5同步

2017-02-16 16:02:39.377 GCD[32197:890372] 7同步

2017-02-16 16:02:43.445 GCD[32197:890372] 8同步

2017-02-16 16:02:47.519 GCD[32197:890372] 9同步

2017-02-16 16:02:51.569 GCD[32197:890372] 6同步

2017-02-16 16:02:55.650 GCD[32197:890372] 1同步

2017-02-16 16:02:59.719 GCD[32197:890372] 2同步

2017-02-16 16:02:59.720 GCD[32197:890372] 4主线程同步

 

 

posted on 2017-02-16 16:09  D_ye了淡淡  阅读(264)  评论(0编辑  收藏  举报