同步函數主隊列多線程
/** - 運行在主線程主隊列(未開啓新的線程),主線程被卡死 - 緣由:任務代碼等待着當前函數執行完畢才能執行(當前函數正在執行且未執行完畢); 當前函數等待着任務代碼 執行完畢才能執行(當前任務正在執行且未執行完畢); 相互等待,出現死鎖 */ //獲取主隊列 dispatch_queue_t queue = dispatch_get_main_queue(); //添加任務到隊列 dispatch_sync(queue, ^{ //任務1代碼 }); dispatch_sync(queue, ^{ //任務2代碼 });
同步函數串行隊列併發
/** - 運行在主線程串行非主隊列(未開啓新的線程),任務串行執行 */ //建立串行隊列 dispatch_queue_t queue = dispatch_queue_create("com.23565@qq", DISPATCH_QUEUE_SERIAL); //添加任務到隊列 dispatch_sync(queue, ^{ //任務1代碼 }); dispatch_sync(queue, ^{ //任務2代碼 });
同步函數併發隊列app
/** - 運行在非主線程併發隊列(未開啓新的線程),任務串行執行 */ //獲取全局隊列(併發) dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //將任務加至隊列 dispatch_sync(queue, ^{ //任務1代碼 }); dispatch_sync(queue, ^{ //任務2代碼 });
異步函數主隊列異步
/** - 運行在主線程主隊列(未開啓新的線程),任務串行執行 */ // 得到主隊列 dispatch_queue_t queue = dispatch_get_main_queue(); // 將任務加入隊列 dispatch_async(queue, ^{ //任務1代碼 }); dispatch_async(queue, ^{ //任務2代碼 });
異步函數串行隊列async
/** - 運行在主函數串行非主隊列(未開啓新的線程),任務串行執行 */ //建立串行隊列 dispatch_queue_t queue = dispatch_queue_create("com.23565@qq", DISPATCH_QUEUE_SERIAL); //將任務加至隊列 dispatch_async(queue, ^{ //任務1代碼 }) dispatch_async(queue, ^{ //任務2代碼 })
異步函數併發隊列ide
/** - 運行在非主線程併發隊列(開啓新的線程),任務併發執行 - 系統根據任務建立線程(沒法肯定任務執行在哪一個線程) */ //得到全局併發隊列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //將任務加入隊列 dispatch_async(queue, ^{ //任務1代碼 }); dispatch_async(queue, ^{ //任務2代碼 });
實現代碼函數
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //須要在子線程中執行的任務代碼 })
實現代碼ui
dispatch_async(dispatch_get_main_queue(), ^{ //須要在主線程中執行的代碼 })
單次執行(一般用在單例模式的設計中)spa
//定義一個標記 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //此處的代碼只會被執行一次 });
延遲執行線程
/** - 方法一(GCD) */ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ //此處的代碼將延遲執行 }); /** - 方法二(performSelector) */ [self performSelector:@selector(run) withObject:self afterDelay:2.0]; /** - 方法三(NSTimer) */ [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:NO]
快速迭代
void dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t)) /** iterations:迭代執行的次數 queue:任務隊列 block:迭代執行的代碼 size_t:用來定義當前迭代到第幾回,須要本身添加,如在size_t後添加index索引,記錄當前的迭代次數 */
Barrier
/** - Barrier中的任務,只能在它前面的任務執行完畢才能執行 Barrier後的任務,只能等到它執行完畢才能執行 - 要將隊列添加到本身建立的併發隊列中,否其功能等同於函數 void dispatch_async(dispatch_queue_t queue, dispatch_block_t block) */ //建立隊列(一般是本身建立的併發隊列) dispatch_queue_t queue = dispatch_queue_create("123", DISPATCH_QUEUE_CONCURRENT); //將任務添加到隊列 dispatch_async(queue, ^{ //在Barrier前執行的任務代碼 }); dispatch_barrier_async(queue, ^{ //Barrier中的任務代碼 }); dispatch_async(queue, ^{ //在Barrier後執行的任務代碼 });
隊列組
//獲取全局併發隊列 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, ^{ //任務1代碼 }); dispatch_group_async(group, queue, ^{ //任務2代碼 }); dispatch_group_notify(group, queue, ^{ //任務3代碼 /** group組中的全部任務執行完畢在執行 若group爲空,則當即執行 */ });
實現代碼
//得到隊列 dispatch_queue_t queue = dispatch_get_main_queue(); //建立一個定時器 self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); //設置定時器的各類屬性(起止時間) dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(8.0 * NSEC_PER_SEC)); uint64_t interval = (uint64_t)(1.0 * NSEC_PER_SEC); //設置 dispatch_source_set_timer(self.timer, start, interval, 0); //設置回調 dispatch_source_set_event_handler(self.timer, ^{ //定時器被觸發時所要執行的代碼 }); //開啓定時器 dispatch_resume(self.timer); //取消定時器 dispatch_cancel(self.timer);