-
延遲執(zhí)行任務(wù)函數(shù)dispatch_after(.....)
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSLog(@"start"); //dispatch_after 是異步執(zhí)行的 //隊(duì)列只決定在哪個(gè)線程中執(zhí)行任務(wù) 并不能決定執(zhí)行時(shí)間 /** * 第一個(gè)參數(shù): 在哪個(gè)時(shí)間點(diǎn)執(zhí)行 * dispatch_time(從哪個(gè)時(shí)間點(diǎn)開始,經(jīng)歷多少納秒) * 第二個(gè)參數(shù): 在哪個(gè)隊(duì)列中執(zhí)行block任務(wù) * 第三個(gè)參數(shù): block任務(wù) */ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"%@",[NSThread currentThread]); }); NSLog(@"end");
}
```
-
一次性執(zhí)行dispatch_once(...)
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//一次性執(zhí)行的機(jī)制,能保證在程序啟動(dòng)后只會(huì)執(zhí)行一次,并且是線程安全的,在主線程中執(zhí)行
//一般使用dispatch_once來(lái)做一次性執(zhí)行,效率高, 在單例模式中使用.
//可以利用互斥鎖在實(shí)現(xiàn)此功能,但不建議使用,因?yàn)樾史浅5?!!!
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"");
});
}
-
柵欄函數(shù)dispatch_barrier_async/dispatch_barrier_sync
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
dispatch_queue_t queue = dispatch_queue_create("yuxuan", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"任務(wù)1");
});
dispatch_async(queue, ^{
NSLog(@"任務(wù)2");
});
//柵欄函數(shù)(同步函數(shù)就沒必要控制順序了,因?yàn)樗怯行虻?
//dispatch_barrier_async 是異步函數(shù)不會(huì)阻塞線程
//dispatch_barrier_sync 是同步函數(shù) 會(huì)阻塞線程
//如果所有任務(wù)都在同一個(gè)并行隊(duì)列中,并且這個(gè)并行隊(duì)列不是系統(tǒng)自帶全局并行隊(duì)列
//哪么在barrier之前添加的方法會(huì)先被執(zhí)行,只有等barrier之前的任務(wù)執(zhí)行完畢后才會(huì)執(zhí)行barrier任務(wù)
//只有barrier任務(wù)執(zhí)行完畢后,才會(huì)執(zhí)行后添加的任務(wù)
dispatch_barrier_async(queue, ^{
NSLog(@"我是個(gè)可愛的路障");
});
dispatch_async(queue, ^{
NSLog(@"任務(wù)3");
});
dispatch_async(queue, ^{
NSLog(@"任務(wù)4");
});
NSLog(@"end");
}
-
隊(duì)列組的使用dispatch_group_t
-
方式一:
-
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//創(chuàng)建一個(gè)隊(duì)列組
dispatch_group_t group = dispatch_group_create();
//創(chuàng)建兩個(gè)不同的隊(duì)列來(lái)測(cè)試
dispatch_queue_t queue1 = dispatch_get_global_queue(0, 0);
dispatch_queue_t queue2 = dispatch_queue_create("yuxuan", DISPATCH_QUEUE_CONCURRENT);
//dispatch_group_async 異步函數(shù)
//系統(tǒng)會(huì)先把任務(wù)放入隊(duì)列中,然后把隊(duì)列放入組中
//從組中把隊(duì)列取出來(lái),在從隊(duì)列里取任務(wù)執(zhí)行
dispatch_group_async(group, queue1, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"download 1");
});
dispatch_group_async(group, queue2, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"download 2");
});
//給group添加一個(gè)通知,異步函數(shù)
//當(dāng)group隊(duì)列中所有任務(wù)執(zhí)行完畢,就會(huì)通知group執(zhí)行block
/*
* 第一個(gè)參數(shù): 為那個(gè)隊(duì)列組添加通知
* 第二個(gè)參數(shù): 決定block在什么線程中執(zhí)行
* 第三個(gè)參數(shù): block 代碼塊
*/
dispatch_group_notify(group, dispatch_queue_create("yuxuan1",DISPATCH_QUEUE_CONCURRENT), ^{
NSLog(@"OK");
});
NSLog(@"end");
}
- ###方式二:
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
/*
dispatch_group_async底層實(shí)現(xiàn):
void dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
{
dispatch_retain(group);
dispatch_group_enter(group);
dispatch_async(queue, ^{
block();
dispatch_group_leave(group);
dispatch_release(group);
});
}
*/
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//創(chuàng)建一個(gè)隊(duì)列組
dispatch_group_t group = dispatch_group_create();
//通知隊(duì)列組進(jìn)入隊(duì)列組
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"111");
//任務(wù)執(zhí)行完畢
//通知隊(duì)列組離開隊(duì)列組
dispatch_group_leave(group);
});
//通知隊(duì)列組進(jìn)入隊(duì)列組
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"222");
//任務(wù)執(zhí)行完畢
//通知隊(duì)列組離開隊(duì)列組
dispatch_group_leave(group);
});
//等待所有任務(wù)執(zhí)行完畢,一直等待.會(huì)阻塞線程
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
// dispatch_group_notify(group, queue, ^{
// NSLog(@"over");
// });
}
-
GCD定時(shí)器
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //創(chuàng)建一個(gè)隊(duì)列,創(chuàng)建GCD定時(shí)器時(shí)使用 dispatch_queue_t queue = dispatch_queue_create("yuxuan", DISPATCH_QUEUE_SERIAL); //創(chuàng)建一個(gè)GCD定時(shí)器(觸發(fā)器) //第四個(gè)參數(shù):傳入一個(gè)隊(duì)列,決定了定時(shí)器回調(diào)任務(wù)執(zhí)行方式. dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); //dispatch_source_t其實(shí)本質(zhì)是一個(gè)類,由于是局部變量,方法執(zhí)行完,就會(huì)被釋放. self.timer = timer; //設(shè)置定時(shí)器 /* 第一個(gè)參數(shù):給那個(gè)定時(shí)器設(shè)置 第二個(gè)參數(shù):什么時(shí)候啟動(dòng) 第三個(gè)參數(shù):間隔多久執(zhí)行一次 第四個(gè)參數(shù):設(shè)置精準(zhǔn)度:0 代表最高精準(zhǔn)(盡量讓定時(shí)器精準(zhǔn)), 大于0的的話代表是在多少秒內(nèi)接受. 第四個(gè)參數(shù)存在意義:主要是為了提高程序性能, 設(shè)置越大,能減輕CPU的壓力 注意:GCD定時(shí)器傳入的時(shí)間都是納秒 */ dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0.0 * NSEC_PER_SEC); //第一個(gè)參數(shù):給那個(gè)定時(shí)器設(shè)置 //第二個(gè)參數(shù):設(shè)置定時(shí)器回調(diào)block //異步執(zhí)行的,具有創(chuàng)建新線程的能力 //具體是否創(chuàng)建線程,創(chuàng)建幾條線程是由定時(shí)任務(wù)創(chuàng)建時(shí),傳入的queue決定的 dispatch_source_set_event_handler(timer, ^{ NSLog(@"%@",[NSThread currentThread]); }); //啟動(dòng)定時(shí)器 dispatch_resume(timer);
}