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_sync(queue,block) 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_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(), ^{
// 等前面的异步操作都执行完毕后,回到主线程...
});
死锁:
(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"); }); }
相关文章推荐
- iOS 浅谈对MVC、传值、和沙盒机制的理解
- ios类别(category)不能添加成员变量但是可以添加属性的问题
- iOS学习——CoreGraphics简单绘图
- iOS 浅谈MVC设计模式及Controllers之间的传值方式
- iOS发展- backBarButtonItem 颜色/文字修改
- 【iOS程序启动与运转】- RunLoop个人小结
- iOS开发 -- 通知Notification
- 猫猫学iOS 之第一次打开Xcode_git配置,git简单学习
- 在xcode 6.4 中设置 ios应用的状态栏的风格
- iOS 9学习系列:如何使用ATS提高应用的安全性
- IOS Webview JS交互之事件拦截获取
- iOS-CoreLocation:无论你在哪里,我都要找到你!
- [iOS备忘录]使用蓝牙耳机headset录音
- 通过WireShark抓取iOS联网数据实例分析
- ios Instruments 内存泄露
- Xcode6下iOS单元测试——XCTest和GHUnit框架简介和比较
- iOS开发小白学习体验-3
- IOS开发札记(2015-08-20)
- 使用CIFilter生成二维码并自定义
- 学习iOS,你能迎娶到白富美吗?