簡體   English   中英

如何並行跟蹤兩個NSProgress?

[英]How to track two NSProgress in parallel?

我有兩個不同的大任務,每個任務都有幾個子任務。 每個子任務都有一個子NSProgress ,我手動NSProgress進行更新。 每個大任務都托管一個父NSProgress其中有幾個

[progress becomeCurrentWithPendingUnitCount:1.0]
// Perform subtask which generates the child `NSProgress`.
[progress resignCurrent]

在不同時間打電話。 此設置可以很好地完成兩個大任務進度報告。

我的問題是我想並行執行這兩個大任務,並且希望整體跟蹤它們的進度。 有什么辦法嗎?

我嘗試在外層創建一個NSProgress對象來包裝兩個大任務的NSProgress (因此總共三個NSProgress級別),但是問題是更新進度時兩個任務“打架”了。 也就是說,一個任務可以執行becomeCurrentWithPendingUnitCount: ,然后另一個任務可以執行resignCurrent ,這會導致異常(因為第二個任務的NSProgress不是當前的)。

使兩個任務依次而不是並行解決了這個問題,但是我真的很想同時執行它們。 有任何想法嗎?

是的,您可以與NSProgress並行運行2個異步操作。 這是我所做的摘要。

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        [self.progress becomeCurrentWithPendingUnitCount:40];
        [self startAsyncTask1];
        [self.progress resignCurrent];
        [self.progress becomeCurrentWithPendingUnitCount:60];
        [self startAsyncTask2];
        [self.progress resignCurrent];
    });

- (void)startAsyncTask1{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        NSProgress *taskProgress = [NSProgress progressWithTotalUnitCount:allUsers.count];
        [taskProgress becomeCurrentWithPendingUnitCount:allUsers.count];
        [self startUploadingAllUsers];
        [taskProgress resignCurrent];
    });
}
-(void)startUploadingAllUsers{
    for(id user in allUsers){
        [self uploadUser:user];
    }
}
-(void)uploadUser:(id)user{
    NSProgress *taskProgress = [NSProgress progressWithTotalUnitCount:user.photos.count];
    //Do upload and in completion of photo upload increment taskProgress.completedUnitCount
    //This last task does not get resigned. It does not become active either.
}

您必須確保您的2個任務是異步的。 這意味着即使任務仍在執行,也將立即調用辭職呼叫。 當我嘗試在完成異步任務時辭職時,由於NSProgress已經在其他地方辭職,導致出現該錯誤。 因此,就像我的示例一樣,Task1和Task2也異步,並且它們中還包含子NSProgresses。 您或多或少希望在啟動異步任務之后立即辭職,而不要等到完成后再辭職。

附帶說明一下,我喜歡使用100個單位作為待處理單位,因此我可以將每個任務視為百分比。 您還可以將字節數用於待處理的單元,但我傾向於在較低的子進程中執行此操作,在該子進程中實際發生數據處理,而不是在父進程中。 像我的示例一樣,我調度了一個異步任務,該任務將所有新的User對象上載到API,並調度了一個過程,用於上載所有新的用戶照片。 照片任務會計算照片的字節大小,並將其用於更新子進程,但父任務約占主任務的40%,這就是為什么我使用百分比,因為有時您不知道匯總的字節數,如果您具有復雜的多對象流程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM