1 // ViewController.m 2 // IOS_0111_多线程 3 // 4 // Created by ma c on 16/1/11. 5 // Copyright (c) 2016年 博文科技. All rights reserved. 6 // 7 8 #import "ViewController.h" 9 10 @interface ViewController () 11 12 @end 13 14 @implementation ViewController 15 16 - (void)viewDidLoad { 17 [super viewDidLoad]; 18 19 // [self textTongBu]; 20 // [self textYiBu]; 21 // [self textSelfMode]; 22 // [self testGroup]; 23 24 25 //在主队列中刷新 26 //在某个block当中的代码的确被执行了,但是在界面中没有效果,这时可以考虑在主队列中执行block中的代码 27 // [self testMainQueueRefresh]; 28 29 //延时操作 30 [self testDelay]; 31 } 32 #pragma mark - 延时操作 33 - (void)testDelay 34 { 35 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 36 NSLog(@"延迟4s执行"); 37 }); 38 } 39 40 #pragma mark - 主队列中刷新 41 - (void)testMainQueueRefresh 42 { 43 void (^block)(void) = ^{ 44 45 //NSLog(@"请求了大量的数据,记载在表格中"); 46 //出现了一个问题,数据请求完毕了,但是没有加载在表格中 47 48 dispatch_async(dispatch_get_main_queue(), ^{ 49 //在这里执行的指令,相当于在主线程中执行 50 NSLog(@"请求了大量的数据,记载在表格中"); 51 }); 52 }; 53 block(); 54 55 56 } 57 #pragma mark - 测试队列组的顺序激发 58 - (void)testGroup 59 { 60 //在队列组中,指令的执行顺序由程序员控制 61 dispatch_group_t group = dispatch_group_create(); 62 63 dispatch_queue_t queue = dispatch_queue_create("www.bowen.com", DISPATCH_QUEUE_CONCURRENT); 64 dispatch_group_async(group, queue, ^{ 65 NSLog(@"执行事件1"); 66 }); 67 dispatch_group_async(group, queue, ^{ 68 NSLog(@"执行事件2"); 69 }); dispatch_group_async(group, queue, ^{ 70 NSLog(@"执行事件3"); 71 }); 72 dispatch_group_notify(group, queue, ^{ 73 NSLog(@"最后执行"); 74 }); 75 } 76 77 #pragma mark - 线程测试 78 //测试同步线程中,指令的执行过程 79 - (void)textTongBu 80 { 81 //在主线程中执行 82 dispatch_async(dispatch_get_main_queue(), ^{ 83 NSLog(@"在线程中要做某事1"); 84 }); 85 dispatch_async(dispatch_get_main_queue(), ^{ 86 NSLog(@"在线程中要做某事2"); 87 }); 88 dispatch_async(dispatch_get_main_queue(), ^{ 89 NSLog(@"在线程中要做某事3"); 90 }); 91 dispatch_async(dispatch_get_main_queue(), ^{ 92 NSLog(@"在线程中要做某事4"); 93 }); 94 } 95 //测试异步线程中,指令的执行过程 96 - (void)textYiBu 97 { 98 //第一个参数:表示队列的类型 99 //第二个参数: 100 dispatch_queue_t queue = 101 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 102 103 dispatch_async(queue, ^{ 104 NSLog(@"在线程中要做某事1"); 105 }); 106 dispatch_async(queue, ^{ 107 NSLog(@"在线程中要做某事2"); 108 }); 109 dispatch_async(queue, ^{ 110 NSLog(@"在线程中要做某事3"); 111 }); 112 dispatch_async(queue, ^{ 113 NSLog(@"在线程中要做某事4"); 114 }); 115 } 116 //自定义队列 117 - (void)textSelfMode 118 { 119 //第一个参数:字符串标志 120 //第二个参数:队列属性 121 dispatch_queue_t customQueue = dispatch_queue_create("www.bowen.com", DISPATCH_QUEUE_CONCURRENT); 122 dispatch_async(customQueue, ^{ 123 NSLog(@"在线程中要做某事1"); 124 }); 125 dispatch_async(customQueue, ^{ 126 NSLog(@"在线程中要做某事2"); 127 }); dispatch_async(customQueue, ^{ 128 NSLog(@"在线程中要做某事3"); 129 }); 130 dispatch_async(customQueue, ^{ 131 NSLog(@"在线程中要做某事4"); 132 }); 133 } 134 135 #pragma mark - 线程的基础知识 136 137 - (void)showThreadInfo 138 { 139 /* 140 1.什么是线程?线程与进程区别? 141 线程:thread - 程序执行流的最小基本单元 142 进程:process - 一个进程就是一个程序 143 一个线程就是在一个程序中完成一个任务的链 144 一个进程可以有多个线程(进程包含线程) 145 ps:如果一个进程只有一个线程,这个线程就是当前程序 146 pss:在一个程序中使用多个线程完成不同的任务的操作,叫做多线程 147 psss:线程被放置在线程队列(FIFO)中,在GCD中,叫dispatch queue,保证先进来的线程优先得到执行 148 149 线程并不是一直都在执行的 - 非线性的不连续状态 150 线程的三种状态:[就绪] [运行] [阻塞] 151 就绪:线程的各个被执行的逻辑条件都满足,逻辑上能执行,等待[处理机]调度执行 152 运行:处理机正在处理线程 153 阻塞:等待逻辑条件都被满足,等待的是指令(函数、block),逻辑上不能运行 154 155 2.多线程的实现方式有几种? 156 线程实现方式: 157 串行:线程中的任务想要执行必须等待[上一个任务]完成 158 并行:线程中的任务想要执行必须等待[上一个任务]开始 159 同步:线程的执行时间与主线程同步 160 异步:线程的执行时间与主线程不同步 161 162 同步串行:在一个与主线程同步的线程中,同步执行任务 163 ps:在计算机中除了主线程外,其余线程都是并行性质 164 异步串行:在与一个主线程不同步的线程中,异步执行任务 165 166 同步并行:线程中多个任务同时向前推进 167 异步并行:线程中多个任务同时进行,但完成度不同 168 169 3.IOS中多线程的实现方式 170 NSThread 线程操作 171 Cocoa NSOperation + NSOperationQueue 线程管理 172 GCD(Grand Center Dispatch) 中央队列处理 173 174 NSThread 175 创建线程,执行线程,关闭线程,在线程中发布指令 176 缺点:繁琐,不利于使用 177 优点:逻辑简单,浅显易懂 178 179 NSOperationQueue 180 (1)NSStackQueue NSBlockQueue 181 (2)NSOperation 182 优点:免去了程序员创建线程,管理数据调度等操作,只要程序员发布指令即可 183 缺点:太繁琐,由于实现方式不同,不便于代码的管理和功能的调和 184 185 GCD(Grand Center Dispatch) 186 缺点:由于实现简单造成的抽象性太强,不便于理解 187 优点:程序员不用再管理线程 188 189 4.什么是GCD-集中式中央队列处理 190 Mac OSX 6.0 +Xcode4.0 引进GCD[集中式中央队列处理] 191 192 在gcd中,程序员操作的东西队列,队列组 193 好处:解决了线程操作的繁琐,队列管理十分简单 194 195 FIFO -> disPatch Queue 196 197 5.GCD队列类型有几种 198 主队列: 199 后台队列: 200 高优先级队列: 201 低优先级队列: 202 默认优先级队列: 203 204 6.GCD中队列的执行方式有几种 205 同步、异步 206 ps:坚决不能在主队列中开启同步队列,因为会造成主队列死锁 207 208 7.线程基本操作 209 获取主队列 - dispatch_get_main_queue() 210 //异步加载 211 dispatch_async(dispatch_get_main_queue(), ^{ 212 NSLog(@"在一个主线程中做某些事"); 213 [tableView reloadData]; 214 }); 215 216 开启新队列 217 dispatch_queue_t queue = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr) 218 (1)开启同步队列 219 dispatch_sync(dispatch_queue_t queue, <#^(void)block#>) 220 第一个参数:开启的队列 221 第二个参数:队列中要执行的命令 222 223 (2)开启异步队列 224 dispatch_async(dispatch_queue_t queue, <#^(void)block#>) 225 226 //所有刷新UI的操作都必须在主线程中执行 227 228 */ 229 230 } 231 232 - (void)didReceiveMemoryWarning { 233 [super didReceiveMemoryWarning]; 234 // Dispose of any resources that can be recreated. 235 } 236 237 @end
1 + (Globle *)shareGloble 2 { 3 static dispatch_once_t onceToken; 4 dispatch_once(&onceToken, ^{ 5 globle = [[Globle alloc] init]; 6 globle.userId = @""; 7 }); 8 9 return globle; 10 }