您的位置:首页 > 其它

GCD的一些简单使用

2016-10-20 11:26 162 查看
//创建一个多线程队列(并行和串行)
//串行
   
dispatch_queue_t serialQueue =
dispatch_queue_create("com.life.little kid serial",
DISPATCH_QUEUE_SERIAL);

//并行
   
dispatch_queue_t concurrentQueue =
dispatch_queue_create("com.like.little gril",
DISPATCH_QUEUE_CONCURRENT);

异步追加
   
dispatch_async(serialQueue, ^{

        NSLog(@"这是一个串行队列");
    });
同步追加(不到万不得已不要使用)
   
dispatch_async(concurrentQueue, ^{
       
NSLog(@"这是一个并行队列");

    });

    /*

     优先级

     *  - DISPATCH_QUEUE_PRIORITY_HIGH:         QOS_CLASS_USER_INITIATED

     *  - DISPATCH_QUEUE_PRIORITY_DEFAULT:      QOS_CLASS_DEFAULT

     *  - DISPATCH_QUEUE_PRIORITY_LOW:          QOS_CLASS_UTILITY

     *  - DISPATCH_QUEUE_PRIORITY_BACKGROUND:   QOS_CLASS_BACKGROUND

*/

    //获取全局队列(并行)

    dispatch_queue_t
queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);

   

    //获取主队列,串行
   
dispatch_queue_t mainQueue = dispatch_get_main_queue();

<
4000
div>

 
//创建分组,监听队列中任务的执行

 

 
dispatch_group_t group =
dispatch_group_create();

 

 
dispatch_queue_t queue =
dispatch_get_global_queue(0, 0);

 

 
dispatch_group_async(group, queue, ^{

   
NSLog(@"1.洗菜");

  });

 

 
dispatch_group_async(group, queue, ^{

   
sleep(10);

   
NSLog(@"2.切菜");

  });

 

 
dispatch_group_async(group, queue, ^{

   
sleep(2);

   
NSLog(@"3.炒菜");

  });

 

 
dispatch_group_async(group, queue, ^{

   
NSLog(@"4.上菜");

  });

 

 
/*

  //所有任务执行完,会通知group

  dispatch_group_notify(group, queue, ^{

    //收尾的任务

    NSLog(@"吃菜");

  });

   */

 

 
//group到达某一个时间点,在时间点去查看任务执行的进度

 
//when,参照时间点

 
//delta,时间偏移量

 

 
dispatch_time_t time =
dispatch_time(DISPATCH_TIME_NOW,
5 *
NSEC_PER_SEC);

 

 
long result =
dispatch_group_wait(group, time);
//wait操作会阻塞当前的线程

 
if (result == 0) {

   
NSLog(@"任务执行完");

   
NSLog(@"吃菜");

  }
else {

   
NSLog(@"有些任务没有执行完");

  }
 

GCD apply 
 //第一个参数,迭代的次数

 
dispatch_apply(array.count,
dispatch_get_global_queue(0, 0), ^(size_t
i) {
/*size_t i 迭代变量*/

   
NSNumber *num = array[i];

   
float f = [num
floatValue];

   
NSLog(@"%.4f", f);
  });

GCD实现单例

//ARC
定义一个类方法
+ (instancetype)sharedChairman {

 

 
static
dispatch_once_t onceToken;

 
dispatch_once(&onceToken, ^{

   
//保证block中的代码,在整个App的生命周期中只执行一次

   
instance = [[super
allocWithZone:nil]
init];

  });

 

 
return
instance;

}

- (id)copy {

 
return
self;

}

//防止alloc方法,创建一个新的对象
//alloc 方法会自动调用allocWithZone:nil

+ (instancetype)allocWithZone:(struct
_NSZone
*)zone {
//  [super allocWithZone:zone]

 
return [self
sharedChairman];
}

起线程名字的时候需要使用bundle id 加上 _线程的属性(serial 和concurrent) 然后_线程数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: