dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);程序員
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);安全
使用dispatch_get_global_queue函數得到全局的併發隊列 dispatch_queue_t dispatch_get_global_queue( dispatch_queue_priority_t priority, // 隊列的優先級 unsigned long flags); // 此參數暫時無用,用0便可 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 得到全局併發隊列 全局併發隊列的優先級 #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 // 後臺
GCD中得到串行有2種途徑 使用dispatch_queue_create函數建立串行隊列 dispatch_queue_t dispatch_queue_create(const char *label, // 隊列名稱 dispatch_queue_attr_t attr); // 隊列屬性,通常用NULL便可 dispatch_queue_t queue = dispatch_queue_create("cn.itcast.queue", NULL); // 建立 dispatch_release(queue); // 非ARC須要釋放手動建立的隊列 使用主隊列(跟主線程相關聯的隊列) 主隊列是GCD自帶的一種特殊的串行隊列 放在主隊列中的任務,都會放到主線程中執行 使用dispatch_get_main_queue()得到主隊列 dispatch_queue_t queue = dispatch_get_main_queue();
注意併發
// 從子線程回到主線程 dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 執行耗時的異步操做... dispatch_async(dispatch_get_main_queue(), ^{ // 回到主線程,執行UI刷新操做 }); });
// iOS常見的延時執行有2種方式 // 調用NSObject的方法 [self performSelector:@selector(run) withObject:nil afterDelay:2.0]; // 2秒後再調用self的run方法 // 使用GCD函數 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 2秒後異步執行這裏的代碼... });
// 使用dispatch_once函數能保證某段代碼在程序運行過程當中只被執行1次 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // 只執行1次的代碼(這裏面默認是線程安全的) });
// 有這麼1種需求 // 首先:分別異步執行2個耗時的操做 // 其次:等2個異步操做都執行完畢後,再回到主線程執行操做 // 若是想要快速高效地實現上述需求,能夠考慮用隊列組 dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 執行1個耗時的異步操做 }); dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 執行1個耗時的異步操做 }); dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // 等前面的異步操做都執行完畢後,回到主線程... });
#if __has_feature(objc_arc) // ARC #else // MRC #endif
// ARC中,單例模式的實現 // 在.m中保留一個全局的static的實例 // static id _instance; // 重寫allocWithZone:方法,在這裏建立惟一的實例(注意線程安全) + (id)allocWithZone:(struct _NSZone *)zone { @synchronized(self) { if (!_instance) { _instance = [super allocWithZone:zone]; } } return _instance; }
// 提供1個類方法讓外界訪問惟一的實例 + (instancetype)sharedSoundTool { @synchronized(self) { if (!_instance) { _instance = [[self alloc] init]; } } return _instance; } // 實現copyWithZone:方法 - (id)copyWithZone:(struct _NSZone *)zone { return _instance; }
// 非ARC中(MRC),單例模式的實現(比ARC多了幾個步驟) // 實現內存管理方法 - (id)retain { return self; } - (NSUInteger)retainCount { return 1; } - (oneway void)release {} - (id)autorelease { return self; }