關(guān)于GCD我用的并不多,都是最基本的,具體如下:
1.獲取主線程,并執(zhí)行:
// 獲取并執(zhí)行主線程
dispatch_queue_t main = dispatch_get_main_queue();
// 異步執(zhí)行
dispatch_async(main, ^{
NSLog(@"1 = %@", [NSThread currentThread]);
NSLog(@"1 = %@", [NSThread mainThread]);
});
注意,不要在主線程同步執(zhí)行主線程,會崩潰的:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 獲取并執(zhí)行主線程
dispatch_queue_t main = dispatch_get_main_queue();
// 同步執(zhí)行
dispatch_sync(main, ^{
NSLog(@"%@", [NSThread currentThread]);
NSLog(@"%@", [NSThread mainThread]);
});
}
2 . 獲取一個分線程,并執(zhí)行
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 異步執(zhí)行
dispatch_async(queue, ^{
NSLog(@"2 = %@", [NSThread currentThread]);
NSLog(@"2 = %@", [NSThread mainThread]);
});
// 同步執(zhí)行
dispatch_sync(queue, ^{
NSLog(@"2 = %@", [NSThread currentThread]);
NSLog(@"2 = %@", [NSThread mainThread]);
});
2.1 創(chuàng)建一個分線程并執(zhí)行:
dispatch_queue_t creatQueue = dispatch_queue_create("http request", DISPATCH_QUEUE_SERIAL);
// 異步執(zhí)行
dispatch_async(creatQueue, ^{
NSLog(@"3 = %@", [NSThread currentThread]);
NSLog(@"3 = %@", [NSThread mainThread]);
});
// 同步執(zhí)行
dispatch_sync(creatQueue, ^{
NSLog(@"3 = %@", [NSThread currentThread]);
NSLog(@"3 = %@", [NSThread mainThread]);
});
// dispatch_release(queue); // 非ARC需要釋放手動創(chuàng)建的隊(duì)列
3 . 具體介紹
dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_SERIAL); //生成一個串行隊(duì)列羡鸥,隊(duì)列中的block按照先進(jìn)先出(FIFO)的順序去執(zhí)行任连,實(shí)際上為單線程執(zhí)行。第一個參數(shù)是隊(duì)列的名稱佑稠,在調(diào)試程序時會非常有用裹刮,所有盡量不要重名了县恕。
dispatch_queue_t queue = dispatch_queue_create("com.dispatch.concurrent", DISPATCH_QUEUE_CONCURRENT); //生成一個并發(fā)執(zhí)行隊(duì)列寥裂,block被分發(fā)到多個線程去執(zhí)行
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //獲得程序進(jìn)程缺省產(chǎn)生的并發(fā)隊(duì)列哈垢,可設(shè)定優(yōu)先級來選擇高早龟、中惫霸、低三個優(yōu)先級隊(duì)列。由于是系統(tǒng)默認(rèn)生成的葱弟,所以無法調(diào)用dispatch_resume()和dispatch_suspend()來控制執(zhí)行繼續(xù)或中斷壹店。需要注意的是,三個隊(duì)列不代表三個線程芝加,可能會有更多的線程硅卢。并發(fā)隊(duì)列可以根據(jù)實(shí)際情況來自動產(chǎn)生合理的線程數(shù),也可理解為dispatch隊(duì)列實(shí)現(xiàn)了一個線程池的管理,對于程序邏輯是透明的将塑。
官網(wǎng)文檔解釋說共有三個并發(fā)隊(duì)列脉顿,但實(shí)際還有一個更低優(yōu)先級的隊(duì)列,設(shè)置優(yōu)先級為DISPATCH_QUEUE_PRIORITY_BACKGROUND点寥。Xcode調(diào)試時可以觀察到正在使用的各個dispatch隊(duì)列艾疟。
4 . dispatch_queue_t queue = dispatch_get_main_queue(); //獲得主線程的dispatch隊(duì)列,實(shí)際是一個串行隊(duì)列敢辩。同樣無法控制主線程dispatch隊(duì)列的執(zhí)行繼續(xù)或中斷蔽莱。