GCD单例的原理
基本思想就是通过状态的判断使得block只被调⽤⼀次。
核⼼代码:
栅栏函数
栅栏函数的效果:等待栅栏函数前添加到队列⾥⾯的任务全部执⾏完成之后,才会执⾏栅栏函数⾥
⾯的任务,栅栏函数⾥⾯的任务执⾏完成之后才会执⾏栅栏函数后⾯的队列⾥⾯的任务。
需要注意的点:
1. 栅栏函数只对同⼀队列起作⽤。
2. 栅栏函数对全局并发队列⽆效。
调度组
调度组的效果:等待调度组前⾯的任务执⾏完才会执⾏dispatch_group_notify函数⾥⾯的任务。
调度组和队列没有关系,只要是同⼀调度组就可以。
信号量dispatch_semaphore
dispatch_semaphore主要就是三个⽅法:
1. dispatch_semaphore_create(long value);这个函数是创建⼀个dispatch_semaphore_t类型的
信号量,并且创建的时候需要指定信号量的⼤⼩。
2. dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout); 等待信
号量。如果信号量值为0,那么该函数就会⼀直等待,也就是不返回(相当于阻塞当前线
程),直到该函数等待的信号量的值⼤于等于1,该函数会对信号量的值进⾏减1操作,然后返
回。
3. dispatch_semaphore_signal(dispatch_semaphore_t deem); 发送信号量。该函数会对信号量
的值进⾏加1操作。
通过这三个⽅法,就能控制GCD的最⼤并发数量。
信号量在使⽤的时候需要注意: dispatch_semaphore_wait 和 dispatch_semaphore_signal ⼀定
要成对出现。因为在信号量释放的时候,如果dsema_orig初始信号量的⼤⼩⼤于dsema_value(通
过dispatch_semaphore_wait和dispatch_semaphore_signal改变之后的信号量的⼤⼩)就会触发崩
溃。
dispatch_source
dispatch_source是⽤来监听事件的,可以创建不同类型的dispatch_source来监听不同的事件。
dispatch_source可以监听的事件类型:
dispatch_source的具体⽤法:在任⼀线程上调⽤它的dispatch_source_merge_data函数,会执⾏
dispatch_source事先定义好的句柄(可以把句柄简单理解为⼀个block)。
dispatch_source的⼏个⽅法: