GCD 总结

1.队列和任务

1> 任务 :需要执行什么操作

* block来封装任务

 

2> 队列 :存放任务

* 全局的并发队列 可以让任务并发执行

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//这里创建一个并发队列(使用全局并发队列也可以)

dispatch_queue_t queue=dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);

 

* 自己创建的串行队列 让任务一个接着一个执行

dispatch_queue_t queue = dispatch_queue_create("cn.heima.queue", NULL);

 

* 主队列 让任务在主线程执行

dispatch_queue_t queue = dispatch_get_main_queue();

 

2.执行任务的函数

1> 同步执行 : 不具备开启新线程的能力

dispatch_sync...

 

2> 异步执行 : 具备开启新线程的能力

dispatch_async...

 

3.常见的组合(掌握)

1> dispatch_async + 全局并发队列

2> dispatch_async + 自己创建的串行队列

 

4.线程间的通信(掌握)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

   // 执行耗时的异步操作...

   dispatch_async(dispatch_get_main_queue(), ^{

       // 回到主线程,执行UI刷新操作

   });

});

 

5.GCD的所有API都在libdispatch.dylibXcode会自动导入这个库

* 主头文件 #import <dispatch/dispatch.h>

 

6.延迟执行(掌握)

1> perform....

// 3秒后自动回到当前线程调用selfdownload:方法,并且传递参数:@"http://555.jpg"

[self performSelector:@selector(download:) withObject:@"http://555.jpg" afterDelay:3];

 

2> dispatch_after...

// 任务放到哪个队列中执行

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

double delay = 3; // 延迟多少秒

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), queue, ^{

    // 3秒后需要执行的任务

});

 

7.一次性代码(掌握)

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

    // 这里面的代码,在程序运行过程中,永远只会执行1

});

 

2>更新UI应该在主线程(UI线程)中进行,并且推荐使用同步调用,常用的方法如下:

  • - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait (或者-(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL) wait;方法传递主线程[NSThread mainThread])
  • [NSOperationQueue mainQueue] addOperationWithBlock:
  • dispatch_sync(dispatch_get_main_queue(), ^{})
posted on 2015-07-07 00:08  pTrack  阅读(90)  评论(0)    收藏  举报