0

我使用NSOperationQueue實現了線程池。其中我將maxConcurrentOperationCount設置爲25。即一次同時運行25個線程。NSOperationQueue暫停和恢復?

我使用這個NSOperationQueue將塊上傳到服務器。所以塊分配給前25個線程。在NSOperationQueue已滿後,我想暫停分塊讀取部分,然後每當隊列中的線程完成時,恢復分塊部分以分配新線程到NSOperationQueue以替換完成的線程。

我的代碼:

NSOperationQueue *operationQueue = [NSOperationQueue new]; 
operationQueue.maxConcurrentOperationCount=5; 

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self                   selector:@selector(upload:)                   object:f_objChunkDetails->FileStream]; 

NSUInteger oprCnt=operationQueue.operationCount; 

if(oprCnt >= 5) { 
    // wait till queue has a free slot 
} else { 
    [operationQueue addOperation:operation]; 
} 

那麼如何暫停和恢復在NSOperationQueue使用?如何在Objective-C中實現ManualResetEvent

回答

0

不要等待或暫停。相反,將您的工作創建(和檢查)轉換爲一種新方法。該方法應循環以創建達到可用限制的作業,然後返回。每個創建的作業都應該添加一個completionBlock,它調用作業創建方法。

以這種方式,你是事件觸發而不是阻塞。

通常,completionBlock在調用作業創建方法之前應更改爲主線程。

+0

目前我正在實現使用NSOperationQueue上傳部分,因此上傳數據到服務器需要時間..而要上傳的數據來自ReadData類,它是快速執行的。所以我想暫停ReadData,直到NSOperationQueue有空間if隊列包含空間ReadData開始工作,接下來的數據被分配給NSOperationQueue ..在C#中它使用ManualResetEvent類實現。 Objective-C的可行解決方案是什麼?我們如何實現多線程的ManualResetEvent? – Snehal

+0

如果你不喜歡我的解決方案,你可以使用'NSConditionLock'。 – Wain

+0

我喜歡你的解決方案,但有任何其他方式來做到這一點..我想要可行的解決方案。 NSConditionLock或NSLock共享資源...我想暫停並單獨恢復我的每個線程。根據我的知識,NSConditionLock不會實現此目的。如果您認爲NSConditionLock是更好的選項,那麼可以請您提供示例代碼。 ..在c#中,我們使用ManualResetEvent類,它使用set,Reset,waitOne方法來暫停和恢復... Objective-c(MAC)的合適選項是什麼。請給出您寶貴的建議... – Snehal