0

以下方法將一些圖像上傳到遠程服務器。我希望它們彼此獨立上傳(並行)。是[NSOperationQueue mainQueue]是一個串行隊列嗎?

- (void)startUploadProcess { 
    for (int i = 0; i < [imageNames count]; i++) { 
     NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{ 
      [GlobalsFuncs uploadImageToServer:[[NSImage alloc] initWithContentsOfURL:[imagePaths objectAtIndex:i]] forSessionID:[[family SessionID] stringValue] withFilename:[imageNames objectAtIndex:i]]; 
     }]; 

     blockOp.completionBlock = ^{ 
      [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
       [self afterUploadCompletion:i]; 
      }]; 
     }; 
     [bgQueue addOperation:blockOp]; 
    } 
} 

- (void)afterUploadCompletion:(NSInteger)pageNumber { 
    NSLog(@"%ld for sessionID : %@", (long)pageNumber, family.SessionID); 
    imagesUploaded++; 
    [progressIndicator incrementBy:progressDelta]; 
} 

從上面的代碼可以看出,我爲每個圖像添加了對afterUploadCompletion方法的調用。在該方法中,我正在遞增一個類實例變量的整數。我的問題是如果我的代碼會導致競爭狀態?基本上,我問的是,如果mainQueue中的所有內容都是串行執行的? 另外,我怎樣才能使NSOperationQueue *bgQueue並行隊列?我想要添加到此隊列的塊不等待以前的操作完成。

非常感謝您的幫助!

+0

爲什麼不你剛剛打印,它在調試程序支持併發的OP數目。這個問題可以節省10分鐘的時間。除此之外,還有一個方便的在線文檔。 – Andy 2014-12-01 22:24:43

回答

2

按照串行方式Apple Documentation[NSOperationQueue mainQueue]執行操作: -

[NSOperationQueue mainQueue]返回隊列在應用程序的主線程上一次執行一個操作。主線程上的操作的執行與必須在主線程上執行的其他任務交錯,例如服務事件和更新應用程序的用戶界面。隊列在運行循環共同模式下執行這些操作,如NSRunLoopCommonModes常量所示。

現在,如果你想以並行或並行方式執行操作。請參閱下面的示例: -

NSOperationQueue * queue = [[NSOperationQueue alloc] init]; 
NSOperation * nwOperation = [[yourOper alloc] init]; 
[queue addOperation:nwOperation]; 

因此,如果您添加多個操作隊列,它們都在後臺線程並行執行,讓你的主線程來處理用戶界面。該隊列將根據用戶所擁有的CPU核心數量智能地調度並行操作的數量,從而有效利用用戶的硬件。

編輯: -

有關併發操作的更多信息,請參閱本Dave Dribin's blog.

+0

謝謝,但是如果我想用[[NSOperationQueue alloc] init]創建的隊列也是串行的呢?將它的'maxConcurrentOperationCount'設置爲1是一個很好的方法嗎? – AyushISM 2014-12-01 20:21:27

+0

根據David的博客,您可以使用隊列來限制使用setMaxConcurrentOperationCount的並行下載數量。 – 2014-12-01 20:28:26

0

是的,主隊列始終是串行的。任何使用[[NSOperationQueue alloc] init]創建的隊列都將是併發的,這意味着傳遞給它的操作將並行運行。

+0

謝謝,但是如果我想用[[NSOperationQueue alloc] init]創建的隊列也是串行的呢?將它的'maxConcurrentOperationCount'設置爲1是一個很好的方法嗎? – AyushISM 2014-12-01 20:11:15

+0

是的。請記住,您應該在所有操作中使用相同的優先級,以防止併發隊列之間的優先級倒置。 – 2014-12-01 21:33:10

相關問題