你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> iOS開發多線程同步

iOS開發多線程同步

編輯:IOS開發基礎

auto-racing-583518_640.jpg

Hi,今天跟大家聊聊iOS開發中多線程同步的話題。說到多線程同步,各位童鞋可能立刻會想到NSLock、NSCondtion甚至OSSpinLock等等各種線程鎖。但是,今天我們不談線程鎖,各位如果對Lock有興趣,可以看看這篇文章,既然不談線程鎖,那說啥?當然是說多線程同步

線程同步不等於線程鎖。要解決同步問題,首先需要了解為什麼需要線程同步,線程不同步主要原因在於多個線程可能同時操作某個對象從而導致狀態不一致的問題。是不是可以這麼理解,如果多線程不會同一時刻訪問對象就解決了同步問題。如何做到這一點?可以采用串行隊列的思想,何為串行隊列?可以簡單理解為所有操作都必須按順序依次執行。主線程就是串行隊列,最簡單的同步方式就是把同步操作放到主線程執行,然並卵,當我沒說

既然不能在主線程執行,放到子線程不就OK?創建子線程的方式有很多,不累述,有興趣的童鞋可以各顯神通

GCD同步

GCD可能是創建子線程最簡單的方式之一,關於GCD,這篇文章做了比較詳細的介紹,不再進一步描述。既然要實現線程同步,首先需要創建串行隊列

_queue = dispatch_queue_create("com.olinone.synchronize.serialQueue", NULL);
dispatch_queue_t dQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_set_target_queue(_queue, dQueue);

然後,將所有同步事件依次加入隊列中即可確保多線程同步

dispatch_async(_queue, ^{
    block();
});

NSOperationQueue同步

通過GCD的方式即可滿足絕大多數需求,但是也難免有個別特殊需求,比如操作的取消。此時,NSOperationQueue將是不錯的選擇

NSOperationQueue雖然是並發多線程池,但是巧妙的設計也可以讓其實現串行隊列的功能。當maxConcurrentOperationCount=1的時候,同一時刻只有一個NSOperation被執行,NSOperationQueue就由並發執行變成串行執行

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
operationQueue.maxConcurrentOperationCount  = 1;

實現方式與GCD一樣,依次將同步操作加入到線程池中即可實現同步操作的串行執行

- (void)execSyncBlock:(void (^)())block {
    if (NSOperationQueue.currentQueue == self) {
        block();
    } else {
        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:block];
        [self addOperations:@[operation] waitUntilFinished:YES];
    }
}

HJSynchronizeDemo詳細展示了實際使用方式。巧妙的利用串行隊列可以帶來意想不到的效果。除了解決多線程同步,還能夠處理串行式大計算等業務,比如圖片渲染,音頻處理等等

PS:本公司最近正在尋求高端iOS開發工程師,有興趣的童鞋可以找我內推!薪資福利大大的有,阿裡股票拿到手軟,更有曉松和宋柯兩位老師帶你齊飛,還可以一睹花塵的真容,還不速速行動起來!點贊可以忘記,內推啥的一定不要忘記我!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved