多线程二(GCD)代码笔记
//
// TWFXViewController.h
// Demo_GCD
//
// Created by Lion User on 12-12-11.
// Copyright (c) 2012年 Lion User. All rights reserved.
// #import <UIKit/UIKit.h> @interface TWFXViewController : UIViewController @property (retain, nonatomic) IBOutlet UILabel *outletLabel1;
@property (retain, nonatomic) IBOutlet UILabel *outletLabel2;
@property (retain, nonatomic) IBOutlet UILabel *outletLabel3;
@property (retain, nonatomic) IBOutlet UILabel *outletLabel4; - (IBAction)btnClick4:(UIButton *)sender;
- (IBAction)btnClick2:(UIButton *)sender;
- (IBAction)btnClick3:(UIButton *)sender;
- (IBAction)btnClick:(UIButton *)sender;
@end
//
// TWFXViewController.m
// Demo_GCD
//
// Created by Lion User on 12-12-11.
// Copyright (c) 2012年 Lion User. All rights reserved.
//
/*
GCD(系统管理线程) 简介
使用GCD你不需要编写线程代码,只需定义想要执行的任务,然后添加到适当的 dispatch queue (调度队列)里
GCD会负责创建线程和调度你的任务.系统直接提供线程管理,比应用实现更高效 基于C的执行自定义任务机制,dispatch queue 按先进先出的顺序,串行或并发地执行任务.dispatch queue 分以下三种:
serial dispatch queue : 串行调度队列,一次只执行一个任务,直到当前任务完成才开始出列并启动下一个任务
主要用于对特定资源的同步访问.虽然每个串行queue本身每次只能执行一个任务,但各个串行queue之间是并发执行的
concurrent dispatch queue: 也称为 global dispatch queue, 并行调度队列,并发执行一个或多个任务,但启动顺序仍是按照添加到queue的顺序启动
你不能创建并发dispatch queues, 只能使用系统已经定义好了的三个全局并发queues,具体下面说到
main dispatch queue : 全局可用的串行 queue,在应用主线程中执行任务,比如用于刷新UI界面 dispatch queue 相关的技术
Dispatch group : 用于监控一组block对象完成
Dispatch semaphore : 类似于传统的 semaphore (信号量)
Dispatch Source : 系统事件异步处理机制 dispatch queue 中的 各个线程,可以通过queue的context指针来共享数据 */ #import "TWFXViewController.h" @interface TWFXViewController () @end @implementation TWFXViewController - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
} - (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} /*
全局并发 Dispatch queue
1. 并发 dispatch queue 可以同时并发执行多个任务,不过并发 queue 仍然按照先进先出的顺序启动任务
2. 并发 queue 同时执行的任务数量会根据应用和系统动态变化,各个因素如:可用核数量 其他进程正在执行的工作数量 其他串行dispatch queue 中的优先任务的数量等
3. 系统会给每个应用程序提供三个并发 dispatch queue,全局共享,三个queue的唯一区别在于优先级不同
*/
- (IBAction)btnClick4:(UIButton *)sender { /*
获取全局并发 dispatch queue : dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
第一个参数表示 queue 的优先级,这里获取默认优先级的那个queue,也可以获取高/低优先级的那个,把 DEFAULT 换成 HIGH 或 LOW 就行了
第二个参数表示 ?
*/
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ); //把一个block加入到全局并发调度队列里
dispatch_async(aQueue, ^(void) { for (int i = ; i < ; i++) { //把block同步添加到主线程里,这样子,demo queue 就会暂停等这个block执行完成才继续执行
dispatch_sync(dispatch_get_main_queue(), ^(void) { NSString *text = [NSString stringWithFormat:@"%d", i];
self.outletLabel3.text = text;
});
} }); //把另一个block加入到全局并发调度队列里.这个block和上面那个block会并发执行
dispatch_async(aQueue, ^(void){ for (int i = ; i < ; i++) { //把block同步添加到主线程里,这样子,demo queue 就会暂停等这个block执行完成才继续执行
dispatch_sync(dispatch_get_main_queue(), ^(void) { NSString *text = [NSString stringWithFormat:@"%d", i];
self.outletLabel4.text = text;
});
} }); } /*
串行 Dispatch queue
1. 串行 queue 每次只能执行一个任务,可以使用它来代替锁,保护共享资源或可变的数据结构,串行queue确保任务按可预测的顺序执行(这是比锁好的地方)
2. 必须显式创建和管理所有你使用的串行queue(数目任意)
*/
- (IBAction)btnClick2:(UIButton *)sender { /*
使用 dispatch_queue_create() 方法来创建串行queue
第一个参数表示 queue 的名字, 第二个参数表示 queue 的一组属性(保留给将来使用)
*/
dispatch_queue_t queue = dispatch_queue_create("demo queue", NULL); /*
异步调度和同步调度
异步调度 dispatch_async : 把一个任务添加到某queue后就马上离开,而不管任务在那个queue里的执行状态
同步调度 dispatch_sync : 把一个任务添加到某queue后,等这个任务完成,调用线程才继续执行.尼玛,坑爹啊 所以,异步调度和同步调度的区别不在于被添加的任务怎样执行,而在于调用线程是否等待任务执行完
*/ //把block异步添加到上面创建的名为 demo queue 的调度队列里
dispatch_async(queue, ^(void){ for (int i = ; i < ; i++) { // sleep(1);
// printf("a%d\t",i); //把block同步添加到主线程里,这样子,demo queue 就会暂停等这个block执行完成才继续执行
dispatch_sync(dispatch_get_main_queue(), ^(void) { NSString *text = [NSString stringWithFormat:@"%d", i];
self.outletLabel1.text = text;
// printf("b%d\n",i);
}); } }); //因为 demo queue 是串行调度队列,所以等上面那个block执行完,下面这个block才会开始
dispatch_async(queue, ^(void){ for (int i = ; i < ; i++) { dispatch_sync(dispatch_get_main_queue(), ^(void) { self.outletLabel2.text = [NSString stringWithFormat:@"%d", i]; });
} }); //xxxxx_create 的object对象要对应 xxxxx_release ?
dispatch_release(queue); //这个循环都会卡屏幕~~~
// for (int i = 0; i < 100000; i++) {
// self.outletLabel1.text = [NSString stringWithFormat:@"%d", i];
// printf("%d\n", i);
// } } -(void)test:(NSString *)data
{
self.outletLabel1.text = data;
} /*
dispatch_group 可以把一组task放到一个group里,等group里的所有task都执行完后再继续运行
*/
- (IBAction)btnClick3:(UIButton *)sender { //重置label2的text
self.outletLabel2.text = @"begin"; //获取一个全局并发 调度队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ); //创建一个 dispatch group
dispatch_group_t group = dispatch_group_create(); //定义 task1
dispatch_block_t task1 = ^(void){ for (int i = ; i < ; i++) { dispatch_sync(dispatch_get_main_queue(), ^(void){ self.outletLabel3.text = [NSString stringWithFormat:@"%d", i];
});
} }; //定义task2
dispatch_block_t task2 = ^(void){ for (int i = ; i < ; i++) { dispatch_sync(dispatch_get_main_queue(), ^(void){ self.outletLabel4.text = [NSString stringWithFormat:@"%d", i];
});
} }; //把task1关联到 queue 和group
dispatch_group_async(group, queue, task1); //把task2关联到 queue和group
dispatch_group_async(group, queue, task2); //等group里的task都执行完后执行notify方法里的内容,相当于把wait方法及之后要执行的代码合到一起了
dispatch_group_notify(group, dispatch_get_main_queue(), ^(void){ self.outletLabel2.text = @"done!"; }); //XXX_create创建,就需要对应的 XXX_release()
dispatch_release(group);
} /*
dispatch source
*/
- (IBAction)btnClick:(UIButton *)sender {
} - (void)dealloc {
[_outletLabel1 release];
[_outletLabel2 release];
[_outletLabel3 release];
[_outletLabel4 release];
[super dealloc];
}
@end
多线程二(GCD)代码笔记的更多相关文章
- IOS多线程 总结 -------------核心代码(GCD)
//NSObject //在子线程中执行代码 // 参数1: 执行的方法 (最多有一个参数,没有返回值) //参数2: 传递给方法的参数 [self performSelectorInBackgrou ...
- iOS 开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- iOS开发多线程篇—GCD介绍
iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...
- iOS开发多线程篇—GCD的基本使用
iOS开发多线程篇—GCD的基本使用 一.主队列介绍 主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行. 提示:如果把任务放到主队列中进 ...
- iOS开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- [iOS]多线程和GCD
新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...
- 《Linux内核设计与实现》 第一二章学习笔记
<Linux内核设计与实现> 第一二章学习笔记 第一章 Linux内核简介 1.1 Unix的历史 Unix的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆 ...
- 《Linux内核设计与实现》第一、二章学习笔记
<Linux内核设计与实现>第一.二章学习笔记 姓名:王玮怡 学号:20135116 第一章 Linux内核简介 一.关于Unix ——一个支持抢占式多任务.多线程.虚拟内存.换页.动态 ...
- iOS开发多线程篇—GCD简介
iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...
随机推荐
- Android——事务
一.什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结 ...
- RavenDb学习(十)附件,存储大对象
.读取 Raven.Abstractions.Data.Attachment attachment = documentStore.DatabaseCommands.GetAttachment(&qu ...
- mysql lower_case_table_names 区分表名大小写设置
Command-Line Format --lower-case-table-names[=#] System Variable Name lower_case_table_names Variabl ...
- mysql ACID与四种隔离级别归纳总结
关于数据库的ACID特性已经有很多的介绍,这里再重新归纳总结一下: A(atomicity)原子性: 即事务要么全部做完,要么全部不做,不会出现只做一部分的情形,如A给B转帐,不会出现A的钱少了, ...
- 从单一WAR到多活, 记述一个创业公司的架构演变
从单一WAR到多活, 记述一个创业公司的架构演变 本故事纯属虚构,如有雷同,实属巧合 程 是一个爱折腾,喜欢交朋友的程序员. 某一天,程一个朋友介绍了另外一个朋友 创 给他,创说他有个点子,可以改变世 ...
- 《开发专家 Visual C 开发入行真功夫》笔记
智能感知的功能,输入 is 后,同时按下Alt + →这两个键就出现了供选择变量.方法.宏等的列表,继续输入 in 后,isInit就出来了. stdafx.h预编译头文件,.h应用程序主头文件,do ...
- PHP中“==”运算符的安全问题
前言 PHP是一种通用的开源脚本语言,它的语法混合了C,Java,以及Perl等优秀语言的语法.除此之外,它还提供了大量的函数库可供开发人员使用.但是,如果使用不当,PHP也会给应用程序带来非常大的安 ...
- poj 1723 中位数
最近在看一些中位数的东西,然后顺便也看了些题目.poj 1723不仅要求到水平位置的最短距离和,还要求水平都相邻的排成一排的最短距离和,即士兵都站成一列. 到y轴的距离好办,按y轴坐标排序,求中位数, ...
- The SDK platform-tools version ((23)) is too old to check APIs compiled with API 26;
好像是更新过啥SDK之后,项目一直在包名的那一行显示红线,不过是不报编译错误的,就是看着老扎心老扎心的,开始以为是指定的SDK版本的问题,修改后发现无效,最后找到方法解决: 打开SDK Manager ...
- Python之使用PIL实现cv2
有时候使用cv2需要安装opencv,但是opencv安装比较麻烦,因为需要编译过程. 所以,我们可以使用PIL对cv2的一些常用接口进行复现. 这里我们实现了cv2的imread(), imwrit ...