多线程02-GCD 掌握
来源:互联网 发布:淘宝申请签约海外买手 编辑:程序博客网 时间:2024/04/30 13:25
gcd的总结
三、GCD1.队列和任务1> 任务 :需要执行什么操作* 用block来封装任务2> 队列 :存放任务* 全局的并发队列 : 可以让任务并发执行dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);* 自己创建的串行队列 : 让任务一个接着一个执行dispatch_queue_t queue = dispatch_queue_create("cn.heima.queue", NULL);* 主队列 : 让任务在主线程执行dispatch_queue_t queue = dispatch_get_main_queue();2.执行任务的函数1> 同步执行 : 不具备开启新线程的能力dispatch_sync...2> 异步执行 : 具备开启新线程的能力dispatch_async...3.常见的组合(掌握)1> dispatch_async + 全局并发队列2> dispatch_async + 自己创建的串行队列4.线程间的通信(掌握)dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执行耗时的异步操作... dispatch_async(dispatch_get_main_queue(), ^{ // 回到主线程,执行UI刷新操作 });});5.GCD的所有API都在libdispatch.dylib,Xcode会自动导入这个库* 主头文件 : #import <dispatch/dispatch.h>6.延迟执行(掌握)1> perform....// 3秒后自动回到当前线程调用self的download:方法,并且传递参数:@"http://555.jpg"[self performSelector:@selector(download:) withObject:@"http://555.jpg" afterDelay:3];2> dispatch_after...// 任务放到哪个队列中执行dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);double delay = 3; // 延迟多少秒dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), queue, ^{ // 3秒后需要执行的任务});7.一次性代码(掌握)static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{ // 这里面的代码,在程序运行过程中,永远只会执行1次});
队列的使用
//// HMViewController.m// 08-GCD02-队列的使用(了解)//// Created by apple on 14-9-15.// Copyright (c) 2014年 heima. All rights reserved.//// dispatch_sync : 同步,不具备开启线程的能力// dispatch_async : 异步,具备开启线程的能力// 并发队列 :多个任务可以同时执行// 串行队列 :一个任务执行完后,再执行下一个任务// Foundation : OC// Core Foundation : C语言// Foundation和Core Foundation框架的数据类型可以互相转换的//NSString *str = @"123"; // Foundation//CFStringRef str2 = (__bridge CFStringRef)str; // Core Foundation//NSString *str3 = (__bridge NSString *)str2;// CFArrayRef ---- NSArray// CFDictionaryRef ---- NSDictionary// CFNumberRef ---- NSNumber// Core Foundation中手动创建的数据类型,都需要手动释放// CFArrayRef array = CFArrayCreate(NULL, NULL, 10, NULL);// CFRelease(array);////// CGPathRef path = CGPathCreateMutable();// CGPathRetain(path);//// CGPathRelease(path);// CGPathRelease(path);/** 凡是函数名中带有create\copy\new\retain等字眼, 都应该在不需要使用这个数据的时候进行release GCD的数据类型在ARC环境下不需要再做release CF(Core Foundation)的数据类型在ARC\MRC环境下都需要再做release */#import "HMViewController.h"@interface HMViewController ()@end@implementation HMViewController- (void)viewDidLoad{ [super viewDidLoad];}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [self asyncSerialQueue];}/** * async -- 并发队列(最常用) * 会不会创建线程:会,一般同时开多条 * 任务的执行方式:并发执行 */- (void)asyncGlobalQueue{ // 获得全局的并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 将 任务 添加 全局队列 中去 异步 执行 dispatch_async(queue, ^{ NSLog(@"-----下载图片1---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片2---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片3---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片4---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片5---%@", [NSThread currentThread]); });}/** * async -- 串行队列(有时候用) * 会不会创建线程:会,一般只开1条线程 * 任务的执行方式:串行执行(一个任务执行完毕后再执行下一个任务) */- (void)asyncSerialQueue{ // 1.创建一个串行队列 dispatch_queue_t queue = dispatch_queue_create("cn.heima.queue", NULL); // 2.将任务添加到串行队列中 异步 执行 dispatch_async(queue, ^{ NSLog(@"-----下载图片1---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片2---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片3---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片4---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片5---%@", [NSThread currentThread]); }); // 3.非ARC,需要释放创建的队列// dispatch_release(queue);}/** * async -- 主队列(很常用) */- (void)asyncMainQueue{ // 1.主队列(添加到主队列中的任务,都会自动放到主线程中去执行) dispatch_queue_t queue = dispatch_get_main_queue(); // 2.添加 任务 到主队列中 异步 执行 dispatch_async(queue, ^{ NSLog(@"-----下载图片1---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片2---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片3---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片4---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片5---%@", [NSThread currentThread]); });}/** * sync -- 主队列(不能用---会卡死) */- (void)syncMainQueue{ NSLog(@"syncMainQueue----begin--"); // 1.主队列(添加到主队列中的任务,都会自动放到主线程中去执行) dispatch_queue_t queue = dispatch_get_main_queue(); // 2.添加 任务 到主队列中 异步 执行 dispatch_sync(queue, ^{ NSLog(@"-----下载图片1---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"-----下载图片2---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"-----下载图片3---%@", [NSThread currentThread]); }); NSLog(@"syncMainQueue----end--");}/**-------------------------------------华丽的分割线-----------------------------------------------------**//** * sync -- 并发队列 * 会不会创建线程:不会 * 任务的执行方式:串行执行(一个任务执行完毕后再执行下一个任务) * 并发队列失去了并发的功能 */- (void)syncGlobalQueue{ // 获得全局的并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 将 任务 添加到 全局并发队列 中 同步 执行 dispatch_sync(queue, ^{ NSLog(@"-----下载图片1---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"-----下载图片2---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"-----下载图片3---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"-----下载图片4---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"-----下载图片5---%@", [NSThread currentThread]); });}/** * sync -- 串行队列 * 会不会创建线程:不会 * 任务的执行方式:串行执行(一个任务执行完毕后再执行下一个任务) */- (void)syncSerialQueue{ // 创建一个串行队列 dispatch_queue_t queue = dispatch_queue_create("cn.heima.queue", NULL); // 将 任务 添加到 串行队列 中 同步 执行 dispatch_sync(queue, ^{ NSLog(@"-----下载图片1---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"-----下载图片2---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"-----下载图片3---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"-----下载图片4---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"-----下载图片5---%@", [NSThread currentThread]); });}@end
线程的基本通信
//// HMViewController.m// 09-GCD03-线程间的通信(掌握)//// Created by apple on 14-9-15.// Copyright (c) 2014年 heima. All rights reserved.//// 需要设置按钮的image和backgroundImage,建议先把按钮类型改为custom,才能保证设置成功// 属性名不能以new开头// 只有在init开头的构造方法中,才允许对self进行赋值#define HMGlobalQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)#define HMMainQueue dispatch_get_main_queue()#import "HMViewController.h"@interface HMViewController ()@property (weak, nonatomic) IBOutlet UIButton *button;@property (weak, nonatomic) IBOutlet UIImageView *newImageView;@end@implementation HMViewController- (void)viewDidLoad{ [super viewDidLoad]; [self newImageView];// NSObject *obj = [NSObject new];// // [[NSObject alloc] init]; // Do any additional setup after loading the view, typically from a nib.}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ dispatch_async(HMGlobalQueue, ^{ NSLog(@"donwload---%@", [NSThread currentThread]); // 1.子线程下载图片 NSURL *url = [NSURL URLWithString:@"http://d.hiphotos.baidu.com/image/pic/item/37d3d539b6003af3290eaf5d362ac65c1038b652.jpg"]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; // 2.回到主线程设置图片 dispatch_async(HMMainQueue, ^{ NSLog(@"setting---%@ %@", [NSThread currentThread], image); [self.button setImage:image forState:UIControlStateNormal]; }); });}@end
0 0
- 多线程02-GCD 掌握
- 网络多线程 - 01-掌握-GCD快速迭代
- GCD多线程
- 多线程GCD
- GCD多线程
- 多线程-GCD
- 多线程 gcd
- 多线程GCD
- 多线程&GCD
- GCD多线程
- 多线程GCD
- 多线程:GCD
- 多线程-GCD
- 多线程GCD
- 多线程-GCD
- GCD(多线程)
- 多线程GCD
- 多线程GCD
- iphone学习路线
- 字符串原地压缩
- (六)SDN 控制器 NOX 源码分析之—— Kernel
- 正则语法
- SQL RELAY开源数据库连接池
- 多线程02-GCD 掌握
- hdu 1133
- JavaScript更多内容
- Java设计模式 —— 策略(Strategy)
- 教育平板加速数字化教育创新
- 约瑟夫环问题
- UILabel 常用属性
- CocoaPods pod install/pod update更新慢的问题
- CTreeCtrl 父结点联动子结点CheckBox