您的位置:首页 > 移动开发 > IOS开发

ios线程-GCD

2015-08-21 09:43 375 查看
GCD—— Grand Central Dispatch

(1)用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

参数说明:

dispatch_queue_t queue:队列

dispatch_block_t block:所要执行的代码块

 

(2)用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

dispatch_queue_t q = dispatch_queue_create("cn.itcast.demoqueue", DISPATCH_QUEUE_SERIAL);//队列名称在调试时辅助

dispatch_sync(q, ^{

    NSLog(@"串行同步 %@", [NSThread currentThread]);

});          //窜行队列同步操作不会新建线程、操作顺序执行(没用!)

dispatch_async(q, ^{

    NSLog(@"串行异步 %@", [NSThread currentThread]);

});         //窜行队列异步操作会新建线程、操作顺序执行(非常有用!)

场景:既不影响主线程,又需要顺序执行的操作!

           

dispatch_queue_t q = dispatch_queue_create("cn.itcast.demoqueue", DISPATCH_QUEUE_CONCURRENT);

dispatch_sync(q, ^{

    NSLog(@"并行同步 %@", [NSThreadcurrentThread]);

});      //同步操作不会新建线程、操作顺序执行

dispatch_async(q, ^{

    NSLog(@"并行异步 %@", [NSThread currentThread]);

});    //异步操作会新建多个线程、操作无序执行

dispatch_sync 和  dispatch_async 区别:

dispatch_async(queue,block)  async 异步队列,
dispatch_async
 函数会立即返回, block会在后台异步执行。

dispatch_sync(queue,block)   sync 同步队列,
dispatch_sync
 函数不会立即返回,及阻塞当前线程,等待
block同步执行完成。

同步函数

(1)并发队列:不会开线程,顺序执行

(2)串行队列:不会开线程

异步函数

(1)并发队列:能开启N条线程

(2)串行队列:开启1条线程,顺序执行
全局队列:
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

主队列:

dispatch_queue_t q = dispatch_get_main_queue();

dispatch_release(queue); //
非ARC需要释放手动创建的队列

从子线程回到主线程:

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执⾏耗时的异步操作...
dispatch_async(dispatch_get_main_queue(), ^{

// 回到主线程,执⾏UI刷新操作
});
});


使用dispatch_once函数能保证某段代码在程序运行过程中只被执行1次

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

    // 只执行1次的代码(这里面默认是线程安全的)

});

整个程序运行过程中,只会执行一次。
延时执行

double delayInSeconds = 2.0;

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 

(int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){        

});

[self performSelector: withObject: afterDelay:];

[NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:]; //
beb1
待研究

有这么1种需求:

首先:分别异步执行2个耗时的操作

其次:等2个异步操作都执行完毕后,再回到主线程执行操作

 

如果想要快速高效地实现上述需求,可以考虑用队列组

dispatch_group_t group =  dispatch_group_create();

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // 执行1个耗时的异步操作

});

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // 执行1个耗时的异步操作

});

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

    // 等前面的异步操作都执行完毕后,回到主线程...

});

死锁:

- (void)viewDidLoad
{
[super viewDidLoad];

dispatch_async(dispatch_get_global_queue(0, 0), ^{

NSLog(@"=================1");

dispatch_sync(dispatch_get_main_queue(), ^{  //等主线程结束,执行block的代码,同时主线程在等sync结束

NSLog(@"=================2");

});
NSLog(@"=================3");

});

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: