//
// ViewController.m
// UI25-Homework
//
// Created by 郭寶 on 16/8/17.
// Copyright ? 2016年 郭寶. All rights reserved.
//
import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *myImageView;
@end
@implementation ViewController
(void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}(IBAction)GCD:(id)sender {
// GCD:(Grand Central Dispatch 翻譯就是 宏大的中央調(diào)度)蘋果開發(fā)的一種多線程的解決方法, 整體非常高效易用, 是目前所有線程處理方式中最好的一種 .基于C語言,提供了非常多強(qiáng)大的函數(shù)
// 串行(Serial):
// 一個(gè)任務(wù)執(zhí)行完, 再執(zhí)行下一個(gè)任務(wù)
// 并發(fā) (Concurrent):
// 多個(gè)任務(wù)同時(shí)執(zhí)行(自動開啟多個(gè)線程),只有在異步函數(shù)下才有效
// 同步(Synchronous):
// 在當(dāng)前線程中執(zhí)行任務(wù)羹应,不具備開啟新線程的能力提交的任務(wù)在執(zhí)行完成后才會返回同步函數(shù): dispatch_sync()
// 異步 (Asynchronous):
// 在新的線程中執(zhí)行任務(wù), 具備開啟線程的能力在新線程中執(zhí)行任務(wù)吏砂,具備開啟新線程的能力提交的任務(wù)立刻返回蔚万,在后臺隊(duì)列中執(zhí)行異步函數(shù): dispatch_async()
// 1.自定義一個(gè)GCD隊(duì)列
// 參數(shù)1:給當(dāng)前的隊(duì)列起一個(gè)名
// 參數(shù)2:選擇并行/串行隊(duì)列
// DISPATCH_QUEUE_CONCURRENT 并聯(lián)
// DISPATCH_QUEUE_SERIAL 串聯(lián) (默認(rèn)NULL)
dispatch_queue_t myQueue = dispatch_queue_create("GCD", DISPATCH_QUEUE_CONCURRENT);
// GCD來完成圖片的異步加載
// 在子線程去加載網(wǎng)絡(luò)數(shù)據(jù), 然后在主線程完成UI頁面的刷新
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// 功能跟主線程一樣凳枝,通過dispatch_get_main_queue()來獲取沪铭,提交到main queue的任務(wù)實(shí)際上都是在主線程執(zhí)行的髓迎,所以這是一個(gè)串行隊(duì)列
dispatch_async(myQueue, ^{
NSString *str = @"http://img4.duitang.com/uploads/blog/201602/05/20160205185029_ZKz2A.jpeg";
NSURL *url = [NSURL URLWithString:str];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
// 回到主隊(duì)列, 刷新控件
dispatch_async(mainQueue, ^{
self.myImageView.image = image;
});
});
}
// 2.創(chuàng)建的線程任務(wù)有四種執(zhí)行方式
//_____________________________________________
//| 并發(fā)隊(duì)列 手動創(chuàng)建的串行隊(duì)列 主隊(duì)列 |
//|同步 沒有開啟新線程 沒有開啟新線程 沒有開啟新線程|
//| 串行執(zhí)行任務(wù) 串行執(zhí)行任務(wù) 串行執(zhí)行任務(wù) |
//|異步 有開啟新線程 有開啟新線程 沒有開啟新線程|
//| 并發(fā)執(zhí)行任務(wù) 串行執(zhí)行任務(wù) 串行執(zhí)行任務(wù) |
//---------------------------------------------
// 并發(fā)隊(duì)列異步執(zhí)行任務(wù)(常用)
- (IBAction)asyncCONCURRENT:(id)sender {
NSLog(@"star");
//一個(gè)隊(duì)列 為 每個(gè)任務(wù)開辟一個(gè)線程
dispatch_queue_t queue = dispatch_queue_create("asyncCONCURRENT", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"CONCURRENT_work_1\n");
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"CONCURRENT_work_2\n");
});
dispatch_async(queue, ^{
NSLog(@"CONCURRENT_work_3");
});
NSLog(@"end");
}
- (IBAction)asyncSERIAL:(id)sender {
NSLog(@"star");
// 會開辟新的線程,但是是串行執(zhí)行任務(wù)
dispatch_queue_t queue = dispatch_queue_create("asyncSERIAL", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"CONCURRENT_work_1\n");
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"CONCURRENT_work_2\n");
});
dispatch_async(queue, ^{
NSLog(@"CONCURRENT_work_3");
});
NSLog(@"end");
}
- (IBAction)syncCONCURRENT:(id)sender {
// 不會開辟新的線程
// 串行執(zhí)行命令
NSLog(@"star");
dispatch_queue_t queue = dispatch_queue_create("syncCONCURRENT", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"CONCURRENT_work_1\n");
});
dispatch_sync(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"CONCURRENT_work_2\n");
});
dispatch_sync(queue, ^{
NSLog(@"CONCURRENT_work_3");
});
NSLog(@"end");
}
- (IBAction)syncSERIAL:(id)sender {
NSLog(@"star");
// 不會開辟新的線程
dispatch_queue_t queue = dispatch_queue_create("syncSERIAL", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"SERIAL_work_1\n");
});
dispatch_sync(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"SERIAL_work_2\n");
});
dispatch_sync(queue, ^{
NSLog(@"SERIAL_work_3");
});
NSLog(@"end");
}
// 當(dāng)我們想在GCD queue中所有的任務(wù)執(zhí)行完畢之后做些特定事情的時(shí)候旱易,也就是隊(duì)列的同步問題禁偎,如果隊(duì)列是串行的話,那將該操作最后添加到隊(duì)列中即可阀坏,但如果隊(duì)列是并行隊(duì)列的話如暖,這時(shí)候就可以利用dispatch_group來實(shí)現(xiàn)了,dispatch_group能很方便的解決同步的問題忌堂。dispatch_group_create可以創(chuàng)建一個(gè)group對象盒至,然后可以添加block到該組里面
// dispatch_group_notify是通過異步的方式通知,所以士修,不會阻塞線程
-(IBAction)asyncGroupNotify:(id)sender {
NSLog(@"star");
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("asyncGroupNotify", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"group_work_1");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:6];
NSLog(@"group_work_2");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"group_work_3");
});
dispatch_group_notify(group, queue, ^{
NSLog(@"dispatch_group_Notify 結(jié)束");
});
}
-
(void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
Main.storyboard.png