2012-06-12 4 views
3

iOS 앱의 포 그라운드 종료 후 작업 완료에 대한 지원을 추가하려고합니다. 내가 인터넷에서 본 모든 자습서는 응용 프로그램 위임이 뭔가를 쓰는 날 지점 :iOS 백그라운드 작업 완료 프로그래밍

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    if ([[UIDevice currentDevice] isMultitaskingSupported]) { 
     UIApplication *application = [UIApplication sharedApplication]; 
     __block UIBackgroundTaskIdentifier background_task; 
     background_task = [application beginBackgroundTaskWithExpirationHandler:^{ 
      [application endBackgroundTask: background_task]; 
      background_task = UIBackgroundTaskInvalid; 
     }]; 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

      //DO STUFF IN BACKGROUND HERE 
      MyTask *task = [[MyTask alloc] initWithURL:@"http://google.com"]; 
      [task setDelegate:self]; 
      [task start]; 

      [application endBackgroundTask: background_task]; 
      background_task = UIBackgroundTaskInvalid; 
     }); 
    } 
} 

작업은 시작할 수 있지만이 시작된 후, 다음 줄이 처리됩니다 내 애플 리케이션이 살해된다. MyTask이 델리게이트 호출로 인해 멈출 때를 알 수 있지만 델리게이트가 호출 된 후 백그라운드 작업이 유효하지 않게 설정되도록 프로그램을 어떻게 변경합니까? 이동하겠습니까?

[application endBackgroundTask: background_task]; 
background_task = UIBackgroundTaskInvalid; 

위임 기능을 수행하거나 다른 작업을 수행해야합니까? 당신의 도움에 미리

감사합니다, Guvvy

답변

6

당신은 dispatch_async로 호출 당 백그라운드 스레드에서 이미입니다. 이 메서드는 즉시 반환되지만 블록은 계속 실행됩니다.

시작 방법이 다른 비동기 프로세스를 실행하므로 메서드가 즉시 반환되고 배경 작업이 종료되어 [task start]이 의미있는 작업을 수행 할 수없는 것 같습니다.

위임자가 background_task이라는 경로를 죽이는 경우 대리자 메서드를 사용할 수 있도록 background_task을 저장하는 ivar도 만들어야합니다. 조금 무거워 보입니다.

이미 백그라운드 스레드에 있기 때문에 제 제안은 [task start]을 리팩터링하여 동기화하는 것입니다. 이렇게하면 다음 줄을 처리하고 background_task이 죽기 전에 모든 의미있는 작업이 수행됩니다. 이것은보다 깨끗해 보이고 백그라운드 작업의 모든 것이 dispatch_async로 전송 된 블록에 잘 포장되어 있습니다.

+0

을 방문하십시오. 안녕하세요. @ djibouti33은 "내 제안은 당신이 리팩토링하는 것이므로 동기입니다."라고 말하려고 노력합니다. . 600 초 후에 NStimer 호출 메서드를 사용하고 있습니다. 하지만 앱이 백그라운드로 갈 때 bgTask가 즉시 만료됩니다. –

+1

[작업 시작] 메서드는 비동기 메서드였습니다. 즉, 작업이 수행되기 전에 즉시 반환 된 다음 background_task가 종료되었음을 의미합니다. 내 동기 만들기, 메서드가 완료 될 때까지 다른 실행을 차단하고 background_task 성공적으로 및 올바른 시간에 죽일 수 있습니다. – djibouti33

-2

당신은 완전히 다음 코드를 제거 할 수 있습니다 : 귀하의 작업이 만료 될 때

[application endBackgroundTask: background_task]; 
background_task = UIBackgroundTaskInvalid; 

, 아이폰 OS는 그것을 죽일 handlerExpiration 메소드를 호출합니다. 자세한 내용은 Background for iOS

+0

이것은 잘못되었습니다. 지정한 시간 내에 endBackgroundTask :를 호출하지 않으면 앱이 완전히 정지되고 사용자의 눈에 더 빨리 "시작"되는 대신 완전히 종료됩니다. https://developer.apple.com/library/ios/documentation/uikit/reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/endBackgroundTask 문서를 참조하십시오. –