1

我有一個調度隊列,它有一些工作。我希望隊列繼續運行,直到任何時間耗盡或隊列被排空,當應用程序進入後臺。我將如何設置UIBackgroundTaskIdentifier?GCD和UIBackgroundTaskIdentifier

我是否需要像這樣將其放入調度塊?

dispatch_async(queue, ^{ 
     if (_bgTask == UIBackgroundTaskInvalid) { 
      if ([UIDevice currentDevice].multitaskingSupported) { 
       _bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) { 
        if (_bgTask != UIBackgroundTaskInvalid) { 
         [[UIApplication sharedApplication] endBackgroundTask:_bgTask]; 
         _bgTask = UIBackgroundTaskInvalid; 
        } 
       }]; 
      } 
     } 

... 
... 

     if (_bgTask != UIBackgroundTaskInvalid) { 
        [[UIApplication sharedApplication] endBackgroundTask:_bgTask]; 
        _bgTask = UIBackgroundTaskInvalid; 
       } 

      }); 

我想在上面發生的事情是它沒有註冊爲一個長期運行的任務,直到隊列實際運行塊。那麼我是否需要將代碼的背景部分放在代碼塊之外,以便在實際排隊之前執行?

回答

3

我不知道你爲什麼跟蹤UIBackgroundTaskID我認爲是一個伊娃。要做到這一點最簡單的方法是:

UIBackgroundTaskIdentifier btid = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{...}]; 
dispatch_async(queue, ^{ 
    ... // Your code... 
    [[UIApplication sharedApplication] endBackgroundTask:btid]; 
} 
1

如果你有一個調度隊列在它的工作項目,你去後臺隊列將繼續其任務工作180秒(適用於iOS 7及以上)。之後,所有操作都由操作系統自動暫停。所以不再有NSThreads,NSTimers甚至NSOperationQueues。一切都暫停了。

所以我不確定你想在你的應用層添加什麼額外的代碼來實現你想要做的。它來預製。