先看一段代码
dispatch_queue_t queue1=dispatch_queue_create("hh", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue= dispatch_queue_create("hl", DISPATCH_QUEUE_CONCURRENT);
for(int i=0;i<10;i++)
{
dispatch_async(queue, ^{
dispatch_sync(queue1, ^{
NSLog(@"hello %d %@",i,[NSThread currentThread]);
});
});
}
执行效果如下图所示,也就是说开启了多个线程,任务都是顺序执行完成的,这里相当于就是,异步执行了这些任务,但是我们仍然可以保证这些任务被顺序的执行,这个主要是被用到在数据库操作中,因为如果耗时的操作我们要放到子线程上执行,如果放到主线程上执行,那就会造成界面的卡顿,所以数据库操作要保证同一个时间,只有一个操作。
在FMDB默认情况下都是在主线程上执行的。
还有一点,串行队列不能嵌套使用,就比如如下代码所示
这个就相当于先把从NSLog(@"hello")这句以及往下的语句放到串行队列中,然后下面又遇到dispatch_sync的时候,又添加了个任务到队列中,然后又是同步执行的,也就是说需要把第一个任务执行完,才能继续执行后面的任务,而后面的任务需要等把第一个任务执行完,再去执行,所以就相互等待了。
dispatch_queue_t queue1=dispatch_queue_create("hh", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue1, ^{
NSLog(@"hello");
dispatch_sync(queue1, ^{
NSLog(@"kko");
});
});