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; 
       } 

      }); 

나는 큐가 실제로 블록을 실행까지가 장기 실행 작업으로 등록되지 않은되고 위에서 무슨 생각합니다. 그래서 블록의 외부에있는 코드의 backgrounding 부분을 놓아야 만 실제로 큐에 들어가기 전에 실행해야합니까?

답변

3

저는 왜 당신이 내 생각에 UIBackgroundTaskID을 추적하고 있는지 확실하지 않습니다. 이 작업을 수행하는 가장 쉬운 방법은 다음과 같습니다

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

당신이에서 작업 항목과 디스패치 큐가 있고 큐 180 초 동안 작업에 작업을 계속합니다 배경 (위의 아이폰 OS 7)로 이동합니다. 그 후에 모든 것이 OS에 의해 자동으로 일시 중지됩니다. 그래서 더 이상 NSThreads, NSTimers 및 심지어 NSOperationQueues. 모든 것이 일시 중지되었습니다.

그래서 내가하려고하는 것을 달성하기 위해 응용 프로그램 계층에 추가하려고하는 코드가 무엇인지 확실하지 않습니다. 그것은 미리 만들어진다.

관련 문제