GCD(1)
2015-10-16 05:07 真实16 阅读(179) 评论(0) 编辑 收藏 举报//
// ViewController.m
// UI-NO-26
//
// Created by Bruce on 15/8/28.
// Copyright (c) 2015年 Bruce. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 死锁 在主队列(GCD)里面 在主线程(UI线程)同步执行任务
// 主队列 跟 主线程 是一个东西
// 同步执行 一个任务完毕之后 才会去执行另外一个任务
// 主队列(GCD)《同步执行》某个任务的时候 会等待前面的任务 执行完毕之后 再去执行 主队列里面的任务
// 但是 主队列 是在 主线程里面 执行任务的 《他们两个现在 在同一个线程里面》 线程 是顺序执行任务的 这时候 主线程 会等主队列里面的任务执行完毕 再去继续执行, 主队列 会等待 主线程 执行完毕 才回去执行 主队列 里面的任务
// 通过GCD 获得主队列 dispatch_get_main_queue
// 所有接收队列对象 都用dispatch_queue_t
// dispatch_queue_t mainQueue = dispatch_get_main_queue();
/*
NSLog(@"主线程执行到这暂停 等待主队列 执行");
// 同步执行任务 dispatch_sync
dispatch_sync(mainQueue, ^{
NSLog(@"主队列 等待 主线程 执行完毕之后 再执行");
});
NSLog(@"😢...");
*/
// 异步执行
// 异步 允许 开辟一个线程 (利用系统空闲时间去执行 程序员 不能控制)
// 同步 不允许 开辟线程 (同步顺序执行)
/*
NSLog(@"主线程 执行到 这 发现一个异步执行的代码, 会执行异步执行的代码, 但是 没有等待 里面的任务 执行完毕之后, 再去 继续执行主线程任务");
dispatch_async(mainQueue, ^{
NSLog(@"小异:小主 没有等我 他自己继续走 😢");
NSLog(@"更新UI%@",[NSThread currentThread]);
});
NSLog(@"小主:不用等 小异 可以继续走 😈");
*/
// dispatch_get_main_queue() 串行队列
// dispatch_queue_create("", NULL) 串行队列
// 串行队列:按照顺序去执行队列
/*
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{
NSLog(@"11111");
});
dispatch_async(mainQueue, ^{
NSLog(@"22222");
});
dispatch_async(mainQueue, ^{
NSLog(@"33333");
});
*/
/*
// 创建队列 《串行队列》
dispatch_queue_t huluwaQueue = dispatch_queue_create("葫芦娃", NULL);
dispatch_sync(huluwaQueue, ^{
NSLog(@"11111");
});
dispatch_sync(huluwaQueue, ^{
NSLog(@"22222");
});
dispatch_sync(huluwaQueue, ^{
NSLog(@"33333");
});
*/
// 串行队列 有两种方式
// 1、主队列
// 2、创建队列
// 串行队列 是按照顺序 执行的
// 并发队列 可以指定队列任务的优先级
// 使用 全局并发队列
//#define DISPATCH_QUEUE_PRIORITY_HIGH 2
//#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
//#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
//#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
// GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创建 dispatch_get_global_queue
/*
// long identifier 指定优先级
dispatch_queue_t firstQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_queue_t twoQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t thirdQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(firstQueue, ^{
NSLog(@"111111");
});
dispatch_async(twoQueue, ^{
NSLog(@"222222");
});
dispatch_async(thirdQueue, ^{
NSLog(@"333333");
});
*/
// 分组
// dispatch_group_create() 创建一个分组
// dispatch_group_t 就相当于 类名
dispatch_group_t num1 = dispatch_group_create();
dispatch_queue_t queue1 = dispatch_queue_create("num1", NULL);
// dispatch_group_t group 组名
// dispatch_queue_t queue 线程名
dispatch_group_async(num1, queue1, ^{
NSLog(@"download1...");
});
dispatch_group_async(num1, queue1, ^{
NSLog(@"download2...");
});
// 分组执行完毕
dispatch_group_notify(num1, queue1, ^{
NSLog(@"执行完毕1");
});
dispatch_group_t num2 = dispatch_group_create();
int nums;
nums = 1;
for (int i=0; i<nums; i++) {
dispatch_group_async(num2, queue1, ^{
NSLog(@"download1...");
});
}
// 分组执行完毕
dispatch_group_notify(num2, queue1, ^{
NSLog(@"执行完毕2");
});
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end