2012-07-15 20 views
2

我用下面的代碼運行任務,GCD:如何檢查任務運行過程中出現

mTimerForImageUpload = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); 
if (mTimerForImageUpload) { 
    dispatch_source_set_timer(mTimerForImageUpload, dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * uploadCheckInterval), NSEC_PER_SEC * uploadCheckInterval, leeway); 
    dispatch_source_set_event_handler(mTimerForImageUpload, ^{ 
     [self uploadData]; 
    }); 
    dispatch_resume(mTimerForImageUpload); 
} 

基本上我想在同一時間只能有一個運行uploadData方法的實例。即如果任務仍在運行,我不想運行新線程,但要等到它完成。

任何想法如何做到這一點?

回答

4

GCD和塊不支持他們自己,但你可以使它工作。

你可以有一個可變集,當它們開始時塊會自己添加它們,當它們完成時自己刪除它們(即它們做的第一件和最後一件事)或去更高的抽象(NSOperation)。

保持軌道運行塊自己

如果添加了塊本身(或像他們上載的資源了一些獨特的鍵),一個可變集,然後你就可以查詢該集合,看看是否有資源已經被使用[runningBlocksSet containsObject:myNewBlockForResoucreThatImAboutToUpload]上傳(對於極長的變量名稱感到抱歉)。

使用NSOperation,看是否isExecuting

如果你對對方選擇使用NSOperations,而不是做上傳那麼他們已經可以支持檢查,如果他們使用[myUploadOperation isExecuting]運行。您還可以檢查它是否被取消,是否完成,或者是否已準備好(操作可以具有依賴關係,並且只有在所有依賴的操作都完成之後才能運行)。

+0

嗨大衛!基本上我正在尋找使用GCD手段的解決方案。你能用GCD的功能來提出一些建議嗎? – deimus 2012-07-15 15:06:55

+0

好的,閱讀更新後的答案 – deimus 2012-07-15 15:08:15

+0

您必須將狀態或操作存儲在其他位置(如NSMutableSet(就像我給出的例子))。 – 2012-07-15 15:08:45

相關問題