標籤:
1 @implementation HMViewController 2 3 - (void)viewDidLoad 4 { 5 [super viewDidLoad]; 6 7 [self performSelectorInBackground:@selector(test) withObject:nil]; 8 9 // [self syncMainQueue]; 10 } 11 12 - (void)test 13 { 14 NSLog(@"test --- %@", [NSThread currentThread]); 15 16 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 17 NSLog(@"任務 --- %@", [NSThread currentThread]); 18 }); 19 } 20 21 /** 22 * 使用dispatch_async非同步函數, 在主線程中往主隊列中新增工作 23 */ 24 - (void)asyncMainQueue 25 { 26 // 1.獲得主隊列 27 dispatch_queue_t queue = dispatch_get_main_queue(); 28 29 // 2.新增工作到隊列中 執行 30 dispatch_async(queue, ^{ 31 NSLog(@"----下載圖片1-----%@", [NSThread currentThread]); 32 }); 33 } 34 35 /** 36 * 使用dispatch_sync同步函數, 在主線程中往主隊列中新增工作 : 任務無法往下執行 37 */ 38 - (void)syncMainQueue 39 { 40 // 1.獲得主隊列 41 dispatch_queue_t queue = dispatch_get_main_queue(); 42 43 // 2.新增工作到隊列中 執行 44 dispatch_sync(queue, ^{ 45 NSLog(@"----下載圖片1-----%@", [NSThread currentThread]); 46 }); 47 // dispatch_sync(queue, ^{ 48 // NSLog(@"----下載圖片2-----%@", [NSThread currentThread]); 49 // }); 50 // dispatch_sync(queue, ^{ 51 // NSLog(@"----下載圖片3-----%@", [NSThread currentThread]); 52 // }); 53 54 // 不會開啟新的線程, 所有任務在主線程中執行 55 } 56 57 // 凡是函數名種帶有create\copy\new\retain等字眼, 都需要在不需要使用這個資料的時候進行release 58 // GCD的資料類型在ARC環境下不需要再做release 59 // CF(Core Foundation)的資料類型在ARC環境下還是需要再做release 60 61 /** 62 * 用dispatch_sync同步函數往串列列中新增工作 63 */ 64 - (void)syncSerialQueue 65 { 66 // 1.建立串列隊列 67 dispatch_queue_t queue = dispatch_queue_create("com.itheima.queue", NULL); 68 69 // 2.新增工作到隊列中 執行 70 dispatch_sync(queue, ^{ 71 NSLog(@"----下載圖片1-----%@", [NSThread currentThread]); 72 }); 73 dispatch_sync(queue, ^{ 74 NSLog(@"----下載圖片2-----%@", [NSThread currentThread]); 75 }); 76 dispatch_sync(queue, ^{ 77 NSLog(@"----下載圖片3-----%@", [NSThread currentThread]); 78 }); 79 80 // 3.釋放資源 81 // dispatch_release(queue); // MRC(非ARC) 82 83 // 總結: 不會開啟新的線程 84 } 85 86 /** 87 * 用dispatch_sync同步函數往並發隊列中新增工作 88 */ 89 - (void)syncGlobalQueue 90 { 91 // 1.獲得全域的並發隊列 92 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 93 94 // 2.新增工作到隊列中 執行 95 dispatch_sync(queue, ^{ 96 NSLog(@"----下載圖片1-----%@", [NSThread currentThread]); 97 }); 98 dispatch_sync(queue, ^{ 99 NSLog(@"----下載圖片2-----%@", [NSThread currentThread]);100 });101 dispatch_sync(queue, ^{102 NSLog(@"----下載圖片3-----%@", [NSThread currentThread]);103 });104 105 // 總結: 不會開啟新的線程, 並發隊列失去了並發的功能106 }107 108 /**109 * 用dispatch_async非同步函數往串列隊列中新增工作110 */111 - (void)asyncSerialQueue112 {113 // 1.建立串列隊列114 dispatch_queue_t queue = dispatch_queue_create("com.itheima.queue", NULL);115 116 // 2.新增工作到隊列中 執行117 dispatch_async(queue, ^{118 NSLog(@"----下載圖片1-----%@", [NSThread currentThread]);119 });120 dispatch_async(queue, ^{121 NSLog(@"----下載圖片2-----%@", [NSThread currentThread]);122 });123 dispatch_async(queue, ^{124 NSLog(@"----下載圖片3-----%@", [NSThread currentThread]);125 });126 127 // 總結: 只開1個線程執行任務128 }129 130 /**131 * 用dispatch_async非同步函數往並發隊列中新增工作132 */133 - (void)asyncGlobalQueue134 {135 // 1.獲得全域的並發隊列136 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);137 138 // 2.新增工作到隊列中 執行139 dispatch_async(queue, ^{140 NSLog(@"----下載圖片1-----%@", [NSThread currentThread]);141 });142 dispatch_async(queue, ^{143 NSLog(@"----下載圖片2-----%@", [NSThread currentThread]);144 });145 dispatch_async(queue, ^{146 NSLog(@"----下載圖片3-----%@", [NSThread currentThread]);147 });148 149 // 總結: 同時開啟了3個線程150 }151 152 @end
ios多線程之GCD