GCD
2015-11-29 12:09
351 查看
dispatch 用得最多的是全局队列的异步任务(耗时操作)、主线程队列异步任务(更新UI)、串行队列异步任务(需要顺序执行的耗时操作)
注意事项:主线程队列里面不能有同步任务,会阻塞
ARC里面不需要手动release
代码如下:
//
// ViewController.m
// GCDLearn
//
// Created by wusiping on 15/11/29.
// Copyright (c) 2015年 wusiping. All rights reserved.
//
#import "ViewController.h"
@interface
ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self
globalQueue];
}
- (void)serailQueue
{
dispatch_queue_t q =
dispatch_queue_create("cn.wsp.gcddemo",
DISPATCH_QUEUE_SERIAL);
//串行队列,先进先出,异步任务先进去,就先执行异步任务,完了再执行同步任务
for (int i =
0 ; i < 5 ; i ++) {
dispatch_async(q, ^{
NSLog(@"串行队列的异步任务是在第二个线程中顺序执行的----%@----%d",[NSThread
currentThread],i );
});
}
for (int i =
0 ; i < 5 ; i ++ ) {
dispatch_sync(q, ^{
NSLog(@"串行队列同步任务是在主线程中顺序执行的----%@---%d ",[NSThread
currentThread ],i);
});
}
}
- (void)concurrentQueue
{
dispatch_queue_t q =
dispatch_queue_create("cn.wsp.gcddemo",
DISPATCH_QUEUE_CONCURRENT);
for (int i =
0 ; i < 5 ; i ++) {
dispatch_async(q, ^{
NSLog(@"并行队列,异步任务在多个线程中并发执行---%@--%d",[NSThread
currentThread],i);
});
}
for (int i =
0 ; i < 5 ; i ++) {
dispatch_sync(q, ^{
NSLog(@"并行队列,同步任务仍然是在主线程中顺序执行---%@--%d",[NSThread
currentThread],i);
});
}
}
- (void)globalQueue
{
dispatch_queue_t q =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
for (int i =
0 ; i < 5 ; i ++) {
dispatch_sync(q, ^{
NSLog(@"全局队列,同步任务在主线程中顺序执行---%@--%d",[NSThread
currentThread],i);
});
}
for (int i =
0 ; i < 5 ; i ++) {
dispatch_async(q, ^{
NSLog(@"全局队列,异步任务在多个线程中并发执行---%@--%d",[NSThread
currentThread],i);
});
}
}
- (void)mainQueue
{
dispatch_queue_t q =
dispatch_get_main_queue();
/*
for (int i = 0 ; i < 5 ; i ++) {
dispatch_sync(q, ^{
NSLog(@"主线程队列,同步任务会被阻塞---%@--%d",[NSThread currentThread],i);
});
}
*/
for (int i =
0 ; i < 5 ; i ++) {
dispatch_async(q, ^{
NSLog(@"主线程队列,异步任务会在主线程上顺序执行,通常用于更新UI---%@--%d",[NSThread
currentThread],i);
});
}
}
@end
注意事项:主线程队列里面不能有同步任务,会阻塞
ARC里面不需要手动release
代码如下:
//
// ViewController.m
// GCDLearn
//
// Created by wusiping on 15/11/29.
// Copyright (c) 2015年 wusiping. All rights reserved.
//
#import "ViewController.h"
@interface
ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self
globalQueue];
}
- (void)serailQueue
{
dispatch_queue_t q =
dispatch_queue_create("cn.wsp.gcddemo",
DISPATCH_QUEUE_SERIAL);
//串行队列,先进先出,异步任务先进去,就先执行异步任务,完了再执行同步任务
for (int i =
0 ; i < 5 ; i ++) {
dispatch_async(q, ^{
NSLog(@"串行队列的异步任务是在第二个线程中顺序执行的----%@----%d",[NSThread
currentThread],i );
});
}
for (int i =
0 ; i < 5 ; i ++ ) {
dispatch_sync(q, ^{
NSLog(@"串行队列同步任务是在主线程中顺序执行的----%@---%d ",[NSThread
currentThread ],i);
});
}
}
- (void)concurrentQueue
{
dispatch_queue_t q =
dispatch_queue_create("cn.wsp.gcddemo",
DISPATCH_QUEUE_CONCURRENT);
for (int i =
0 ; i < 5 ; i ++) {
dispatch_async(q, ^{
NSLog(@"并行队列,异步任务在多个线程中并发执行---%@--%d",[NSThread
currentThread],i);
});
}
for (int i =
0 ; i < 5 ; i ++) {
dispatch_sync(q, ^{
NSLog(@"并行队列,同步任务仍然是在主线程中顺序执行---%@--%d",[NSThread
currentThread],i);
});
}
}
- (void)globalQueue
{
dispatch_queue_t q =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
for (int i =
0 ; i < 5 ; i ++) {
dispatch_sync(q, ^{
NSLog(@"全局队列,同步任务在主线程中顺序执行---%@--%d",[NSThread
currentThread],i);
});
}
for (int i =
0 ; i < 5 ; i ++) {
dispatch_async(q, ^{
NSLog(@"全局队列,异步任务在多个线程中并发执行---%@--%d",[NSThread
currentThread],i);
});
}
}
- (void)mainQueue
{
dispatch_queue_t q =
dispatch_get_main_queue();
/*
for (int i = 0 ; i < 5 ; i ++) {
dispatch_sync(q, ^{
NSLog(@"主线程队列,同步任务会被阻塞---%@--%d",[NSThread currentThread],i);
});
}
*/
for (int i =
0 ; i < 5 ; i ++) {
dispatch_async(q, ^{
NSLog(@"主线程队列,异步任务会在主线程上顺序执行,通常用于更新UI---%@--%d",[NSThread
currentThread],i);
});
}
}
@end
相关文章推荐
- 五种IO 模型
- 高德地图的基本使用
- 合并两个排序的链表(C++版)
- 8天学通MongoDB——第八天 驱动实践
- HDU5584 LCM Walk 数论
- BZOJ 1097: [POI2007]旅游景点atr( 最短路 + 状压dp )
- 在自定义的类中使用Doctrine
- [leetcode 199]Binary Tree Right Side View
- Eclipse使用android.support.v7.widget.RecyclerView出现 java.lang.reflect.InvocationTargetException
- css网页布局
- iOS高级控件与设计模式的练习
- EditText使用软键盘
- 服务器/客户端编程范例
- 开发自己的spark API
- linux 下IPTABLES配置详解
- 8天学通MongoDB——第七天 运维技术
- C++模版完全解析
- FileZilla Client Windows 2003 最新可用版本
- Web系统性能测试术语简介
- C++中的static关键字