GCD

任务

同步(阻塞当前线程)与异步(不会)

队列

串行与并行

//全局并发的队列 参数1:优先级

dispatch_get_global_queue(0,0)

// 如果我们自己创建穿行队列的话 不会另外开辟线程 只在同一条线程中执行 从而控制任务的先后执行顺序

dispatch_queue_t myQueue = dispatch_queue_create("name",NULL);// 串行队列

dispatch_queue_t myQueue = dispatch_queue_create("name",DISPATCH_QUEUE_CONCURRENT);// 并行队列

 

dispatch_async(dispatch_get_global_queue(0,0),^{、

  //执行耗时操作(db image)

  [NSThread sleepForTimeInterval:3];

  dispatch_async(dispatch_get_main_queue(),^{

  //回到主线程刷新UI

  });

});

 

需求 多个任务异步处理之后 统一的回掉通知处理其他任务(维修详情界面的数据请求与UI刷新) 可用到 dispatch_group

dispatch_group_t groupQueue = dispatch_group_create();

dispatch_group_async(group, queue, ^{

 1 

  如果是异步操作的需要放到group中

  dispatch_group_enter(groupQueue);

  [self request:^{

  dispatch_group_leavc(groupQueue);

  }];

});

dispatch_group_async(group, queue, ^{

 2

});

dispatch_group_async(group, queue, ^{

 3 

});

//统一的回掉通知

dispatch_group_notify(group, queue, ^{

  123任务都执行完的回掉通知 在异步线程中

});

 

GCD实现单例

static dispatch_once_t onceToken;

static Single *single = nil;

dispatch_once(&onceToken, ^{

  single = [[Single alloc] init];

});

return single;

延迟加载

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_i)(2*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

  避开动画以及业务等

  一定避免执行已经释放的变量

  

});

posted @ 2017-03-14 22:59  iWillW  阅读(174)  评论(0编辑  收藏  举报