先直接上常用功能代碼:
1.延時函數
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 這里要特別注意:第二個參數單位是納秒,就是說,延時1秒的話,應該是“1000000000”
// to do:
});
// 系統(tǒng)定義的宏
#define NSEC_PER_SEC 1000000000ull //每秒有多少納秒
#define NSEC_PER_MSEC 1000000ull
#define USEC_PER_SEC 1000000ull
#define NSEC_PER_USEC 1000ull
2.異步操作
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// to do
// 異步操作,一般為比較耗時的操作
dispatch_async(dispatch_get_main_queue(), ^{
// to do
// 更新界面
});
});
3.一組線程執(zhí)行完畢之后執(zhí)行(無序)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
// to do
// 第一組
});
dispatch_group_async(group, queue, ^{
// to do
// 第二組
});
dispatch_group_async(group, queue, ^{
// to do
// 第三組
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// to do
// 三個任務都執(zhí)行完畢后執(zhí)行
});
4.執(zhí)行某段代碼n次
dispatch_apply(5, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
// to do
});
5.timer
#import "ViewController.h"
@interface ViewController ()
{
dispatch_source_t _timer;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 獲取一個隊列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 創(chuàng)建一個timer放到隊列里
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
// 設置timer首次執(zhí)行的時間,間隔,精確度
dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0);
// 設置timer執(zhí)行的事件
__weak typeof(self) SELF = self;
dispatch_source_set_event_handler(_timer, ^{
[SELF log];
});
// 激活timer
dispatch_resume(_timer);
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// 取消timer
dispatch_source_cancel(_timer);
}
- (void)log {
NSLog(@"123");
}
6.單例模式
+ (Class*)instance {
static Class *class = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
class = [[self alloc] init];
});
return class;
}
CGD(Grand Central Dispatch,大中樞派發(fā))
GCD是蘋果開發(fā)的一個多核編程的解決方法,還有兩種NSThread,NSOperarion;
GCD是蘋果推薦而且最簡潔的;
純C語言,提供了非常多強大的函數;
GCD會自動利用更多的CPU內核(比如雙核、四核);
GCD會自動管理線程的生命周期(創(chuàng)建線程、調度任務、銷毀線程);
只需要告訴GCD想要執(zhí)行什么任務,不需要編寫任何線程管理代碼
GCD中的函數大多數都以dispatch開頭
在理解GCD之前,請先理解進程,線程,同步、異步執(zhí)行,并行、串行隊列
同步隊列:在當前線程中執(zhí)行任務,不具備開啟新線程的能力
異步隊列:具備開啟新線程的能力
并行:多個任務并發(fā)(同時)執(zhí)行
串行:一個任務執(zhí)行完畢后,再執(zhí)行下一個任務
GCD的2個核心概念:
- 隊列:用來存放任務
- 任務:執(zhí)行什么操作
將任務添加到隊列中,GCD會自動將隊列中的任務取出,放到對應的線程中執(zhí)行,任務的取出遵循隊列的FIFO原則
GCD的隊列可以分為2大類型
并發(fā)隊列(Concurrent Dispatch Queue)
可以讓多個任務并發(fā)執(zhí)行,并發(fā)功能只有在異步(dispatch_async)函數下才有效串行隊列(Serial Dispatch Queue)
讓任務一個接著一個地執(zhí)行
使用dispatch_get_main_queue()獲得主隊列,主隊列是GCD自帶的一種特殊的串行隊列,放在主隊列中的任務,都會放到主線程中執(zhí)行
注意:
iOS 所有的UI操作都必須在主線程上執(zhí)行
GCD提供了全局的并發(fā)隊列,不需要手動創(chuàng)建
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
第一個參數為優(yōu)先級,第二個參數文檔上說以后會用到,目前都傳0即可
全局并發(fā)隊列的優(yōu)先級如下
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默認(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
// 后臺
希望會給大家?guī)韼椭鶲(∩_∩)O