標籤:style blog color 使用 io 資料 for ar
1. 很多時候我們需要保證讀寫資料的安全性,這時候最好不要使用@synchronized同步塊,因為同步塊中的代碼必須單獨執行,這有可能會使當前的代碼等許多無關的代碼執行完畢才能繼續執行,降低程式運行效率。此外還有NSLock ,NSRecursiveLock這些鎖,但是這些鎖也應該少用,
最好的辦法就是用GCD隊列保證資料的安全性,而且GCD基於XUN核心,提供了很多底層最佳化
dispatch_queue_t serialQ = dispatch_queue_create("testGCDQueue",DISPATCH_QUEUE_SERIAL); dispatch_barrier_async(serialQ, ^{ // safe });
dispatch_queue_t serialQ = dispatch_queue_create("testGCDQueue",DISPATCH_QUEUE_SERIAL); dispatch_barrier_sync(serialQ, ^{ // safe });
如果塊中的代碼量比較少,你會發現asyn居然比syn慢,這是因為asyn需要拷貝塊,但是當塊裡面邏輯運算負責的時候據要看具體情況了
保證資料安全一般是在set和get方法裡,所以一般而且資料是允許多讀單寫的
如果使用並發隊列,可以再set裡面使用syn在get裡面使用asyn,但是讀寫有可能會交叉進行,所以這樣不是很安全
GCD裡面提供了一種柵欄塊,這種塊會等之前的任務塊全部執行完畢以後再執行,而柵欄塊之後的塊需要等到柵欄塊執行完畢之後才執行,這樣便能提高安全性還能並發執行
dispatch_barrier_async(cerialQ, ^{ // safe });
2.performSelector系列方法在記憶體管理方面有所疏漏,他無法確定將要執行的選擇自具體是什麼,因而ARC編譯器也就無法插入適當的記憶體管理方法
而且Per還有很大局限性,per所能實現的功能GCD或者operation都能實現
3.dipatch_group機制可以將隊列分組,調用者可以獲悉這組任務何時執行完畢
dispatch_group_t group = dispatch_group_create();long b = dispatch_group_wait(group, DISPATCH_TIME_FOREVER); NSLog(@"111111Hello, World!%ld",b); // NSLog(@"Hello, World!%ld",a); dispatch_sync(queue1, ^{ for (int i = 0 ; i< 10000 ;i++) { NSLog(@"cccccccc"); } NSLog(@"ququeee1"); }); NSLog(@"3333333Hello, World!%ld",b);
上面的代碼是建立一個dispatch_group,等待queue1執行,DISPATCH_TIME_FOREVER是永遠等待執行,如果是永遠等待,wait函數會返回0.,如果不是DISPATCH_TIME_FOREVER,而是一個數,如果這個數小於執行的執行時間則返回非0.否則返回0