1 // 同步函數 + 串行隊列 2 // 不會開啟新線程,任務是在當前線程執行. 3 // 如果當前線程是子線程的話,就是在子線程執行 4 // 任務是按順序執行的 5 -(void)test1 6 { 7 dispatch_queue_t serialQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL); 8 // 同步函數 9 dispatch_sync(serialQueue, ^{10 // 任務11 NSLog(@"下載圖片1%@",[NSThread currentThread]);12 });13 // 同步函數14 dispatch_sync(serialQueue, ^{15 // 任務16 NSLog(@"下載圖片2%@",[NSThread currentThread]);17 });18 // 同步函數19 dispatch_sync(serialQueue, ^{20 // 任務21 NSLog(@"下載圖片3%@",[NSThread currentThread]);22 });23 }24 25 // 同步函數 + 全局并發隊列26 // 不會開啟新線程,在當前線程執行27 // 如果當前線程是子線程的話,就是在子線程執行28 // 任務按順序執行29 - (void)test230 {31 dispatch_queue_t queue = dispatch_get_global_queue(0, 0);32 dispatch_sync(queue, ^{33 NSLog(@"下載圖片1%@",[NSThread currentThread]);34 });35 dispatch_sync(queue, ^{36 NSLog(@"下載圖片2%@",[NSThread currentThread]);37 });38 dispatch_sync(queue, ^{39 NSLog(@"下載圖片3%@",[NSThread currentThread]);40 });41 }42 // 對于同步函數 + 串行隊列 和 +并發隊列 執行效果是一樣的.43 // 同步函數 +主隊列44 // 主隊列中的任務都會交給主線程來執行.45 // 主線程中的任務和主隊列中的任務相互等待,無法執行完畢46 - (void)test347 {48 dispatch_sync(dispatch_get_main_queue(), ^{49 NSLog(@"下載圖片1%@",[NSThread currentThread]);50 });51 dispatch_sync(dispatch_get_main_queue(), ^{52 NSLog(@"下載圖片2%@",[NSThread currentThread]);53 });54 dispatch_sync(dispatch_get_main_queue(), ^{55 NSLog(@"下載圖片3%@",[NSThread currentThread]);56 });57 NSLog(@"test3End%@",[NSThread currentThread]);58 59 }
1 // 異步函數 + 主隊列 2 // 不會開啟新線程 3 // 任務按順序執行 4 // 不會卡死主線程 5 dispatch_async(dispatch_get_main_queue(), ^{ 6 7 NSLog(@"下載圖片1%@", [NSThread currentThread]); 8 }); 9 // 異步函數 + 主隊列10 dispatch_async(dispatch_get_main_queue(), ^{11 NSLog(@"下載圖片2%@", [NSThread currentThread]);12 });13 // 異步函數 + 主隊列14 dispatch_async(dispatch_get_main_queue(), ^{15 NSLog(@"下載圖片3%@", [NSThread currentThread]);16 });17 18 // 異步函數 + 串行隊列19 // 開啟一條新線程.20 // 一個隊列對應一條線程.每一條線程中的任務都是按順序執行-- 串行執行.21 // 如果創建了多個串行隊列,會開啟多條線程.22 - (void)test123 {24 dispatch_queue_t queue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL);25 dispatch_queue_t queue1 = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL);26 dispatch_async(queue, ^{27 NSLog(@"下載圖片1%@", [NSThread currentThread]);28 });29 dispatch_async(queue1, ^{30 NSLog(@"下載圖片2%@", [NSThread currentThread]);31 });32 33 dispatch_async(queue1, ^{34 NSLog(@"下載圖片3%@", [NSThread currentThread]);35 });36 37 dispatch_async(queue, ^{38 NSLog(@"下載圖片4%@", [NSThread currentThread]);39 });40 } 41 42 // 異步函數 + 全局并發隊列43 // 開啟一條線程,在子線程中執行任務44 // 根據任務數量,開啟多條線程.45 // GCD自動幫我們開啟一定數量的線程.46 - (void)test247 {48 dispatch_queue_t queue = dispatch_get_global_queue(0, 0);49 // 異步函數 + 全局并發隊列50 dispatch_async(queue, ^{51 NSLog(@"下載圖片1%@",[NSThread currentThread]);52 });53 // 異步函數 + 全局并發隊列54 dispatch_async(queue, ^{55 NSLog(@"下載圖片2%@",[NSThread currentThread]);56 });57 }58 59 // 一次性代碼,只會執行一次,能夠保證線程安全的.60 // 線程第一次執行完任務之后,其他線程就不會再進來了.61 static dispatch_once_t onceToken;62 dispatch_once(&onceToken, ^{63 NSLog(@"%@",[NSThread currentThread]);64 NSLog(@"一次性代碼,只執行一次%@",string);65 });66 67 //隊列組的使用68 -(void)groupTest69 {70 __block UIImage *image1,*image2;71 // 創建一個隊列組72 dispatch_group_t group = dispatch_group_create();73 // 將我們需要執行的任務放在隊列中里面74 // 異步的方法75 dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{76 // 任務177 NSLog(@"renwu 1");78 image1 = [self downloadImageWithUrlString:@"http://e.hiphotos.baidu.com/zhidao/pic/item/203fb80e7bec54e722c5454ebb389b504fc26ab0.jpg"];79 });80 // 再往隊列組中添加一個任務81 dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{82 // 任務283 NSLog(@"renwu 2");84 image2 = [self downloadImageWithUrlString:@"http://www.cnwan.com.cn/uploads/allimg/2011-07/01002414-1-10j14.jpg"]; 85 });86 // 隊列組中的任務都執行完畢以后,會發送一個通知,執行下面的方法87 dispatch_group_notify(group, dispatch_get_main_queue(), ^{88 // 隊列組中的任務執行完畢之后的操作89 NSLog(@"renwu over");90 // 合并圖片91 self.imageView.image = [self BingImageWith:image1 :image2]; 92 });93 }
新聞熱點
疑難解答