GCD小记

1.dispatch_async

适用场景:后台异步执行一些耗时任务,或后台任务完成后更新UI,

适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue


2.dispatch_after

适用场景:延时执行任务,使用起来就像延时的dispatch_async。既不能控制任务的准确开始执行时间,一旦dispatch_after返回后,也不能取消任务。

适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue

示例:double delayInSeconds = 1.0;

    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 

    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 

        //task

    });


3.dispatch_once

适用场景:线程安全的执行且仅执行一次代码,常用来确保生成单例

适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue

示例:+ (instancetype)sharedInstance  

{

    static id *sharedInstance = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        sharedInstance = [[self alloc] init];

    });

    return sharedInstance;

}


4.dispatch barriers

适用场景:一组用于在并发队列中实现串行访问的函数,可用于实现读写锁。使用dispatch barriers函数可以保证在某个队列的某个特定时间,只有唯一一个任务运行。GCD提供了同步和异步两种 barrier函数。

适用队列:Global Concurrent Queue,Custom Concurrent Queue

示例:dispatch_barrier_async(self.concurrentPhotoQueue, ^{

//task

            dispatch_async(dispatch_get_main_queue(), ^{

                //update UI 

            });

        });

        

5.dispatch_sync

适用场景:同步执行任务

适用队列:Main Queue (Serial),Concurrent Queue


6.dispatch groups

适用场景:dispatch groups可以在一组任务完成之后通知用户。这些任务可以是同步的,也可以是异步的,甚至可以处在不同的队列之中。dispatch groups任务完成之后的通知方式有同步和异步两种,可以通过dispatch_group_t引用跟踪管理不同队列中的任务。

适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue

示例:

同步通知方式- dispatch_group_t downloadGroup = dispatch_group_create();


dispatch_group_enter(downloadGroup);

//task

dispatch_group_leave(downloadGroup);

...

dispatch_group_wait(downloadGroup, DISPATCH_TIME_FOREVER);

        dispatch_async(dispatch_get_main_queue(), ^{

            if (completionBlock) {

                completionBlock(error);

            }

        });

       

异步通知方式- dispatch_group_t downloadGroup = dispatch_group_create();


dispatch_group_enter(downloadGroup);

//task

dispatch_group_leave(downloadGroup);

...

dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{

        if (completionBlock) {

            completionBlock(error);

        }

    });

   

7.dispatch_apply

适用场景:dispatch_apply功能与for循环一致,不同之处在于dispatch_apply可以并发执行多个循环。dispatch_apply是同步函数,因此与for循环一样,只有所以循环全部完成后才会返回。

适用队列:Concurrent Queue

示例:dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) {

 

        switch (i) {

            case 0:

            

                break;

            case 1:

                

                break;

            case 2:

                

                break;

            default:

                break;

        }

    });

    

8.dispatch semaphore

适用场景:使用semaphore可以控制在资源有限的情况下,同时访问资源的消费者数量。可以用来阻塞线程。

适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue

示例:dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

  //task

     dispatch_semaphore_signal(semaphore);

 

    dispatch_time_t timeoutTime = dispatch_time(DISPATCH_TIME_NOW, kDefaultTimeoutLengthInNanoSeconds);

    if (dispatch_semaphore_wait(semaphore, timeoutTime)) {

    }


9.dispatch source

不常用。。。


你可能感兴趣的:(gcd)