2012-11-26 2 views
7

의 백그라운드를 입력했습니다. 온라인 데이터베이스의 일부 핵심 데이터 요소를 업데이트하는 일부 NSOperation이 있습니다. 언젠가는 업데이트가 필요하며, iPhone 잠금 화면이 앱에 들어가면 백그라운드 모드,이 업데이트는 중지되고 그래서 업데이트를 계속하려면 응용 프로그램을 다시, 그래서 내가 스택 오버 플로우에 많이 검색하고 난 다음에 대한 몇 가지 정보를 찾을 수 있습니다에서하는 방법입니다앱이 iOS에서 배경을 입력했을 때 계속 작업 내 앱에

beginBackgroundTaskWithExpirationHandler 

을 사과는 앱이 백그라운드 모드에있을 때 몇 가지 작업을 계속하게 해줍니다. 그리고 나는 이렇게했습니다 :

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 

UIApplication *app = [UIApplication sharedApplication]; 
UIBackgroundTaskIdentifier bgTask; 

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:bgTask]; 
}]; 
} 

그리고 이제 앱이 백그라운드에서 작업을 계속하고 모든 것이 제대로 작동하므로 내 질문에이 방법이 유용합니다. 또는 더 나은 모드가 있습니까?

감사합니다.

+1

여기에 게시 된 답변을 확인하십시오. http://stackoverflow.com/questions/12071726/how-to-use-beginbackgroundtaskwithexpirationhandler-for-already-running-task-in – iDev

답변

12

이렇게하는 방법은 아닙니다. 백그라운드에서 실행하려는 모든 코드는 올바르게 포장되어야합니다. 이런 식으로 뭔가가 :

- (void)someMethodToKeepRunningInBackground { 
    UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) { 
     // Uh-oh - we took too long. Stop task. 
    }]; 

    // Perform task here   

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

당신은 UIApplicationDelegate applicationDidEnterBackground: 방법에 아무것도하지 않습니다.

"백그라운드 작업"호출 안에 래핑 된 모든 작업은 앱이 백그라운드로 들어갈 때 계속 실행될 수 있습니다.

여기 중요한 부분이 있습니다. 작업은 최대 10 분 밖에 걸리지 않습니다. 10 분 후에도 앱이 계속 실행 중이면 앱이 종료됩니다. 만료 처리기는 앱이 깨끗하게 종료되기 전에 작업을 완전히 끝내는 데 몇 초를줍니다.

+0

네, 웹에서 검색하고 있습니다. 해결책은 당신이 방금 썼다지만, 내 질문에 작품 코드를 쓴, 어떻게 모르겠지만 내가 업데이 트를 누른 다음 홈 버튼을 누르면 내가 몇 분 후에 응용 프로그램을 열 때 업데이트 제대로 끝났습니까, 어떻게 설명할까요? – Piero

+0

게시 한 코드가 작동하지만 리소스가 낭비됩니다. 작성된 것처럼, 코드는 백그라운드에서 살아남을 수 있도록 앱이 백그라운드로 들어갈 때마다 10 분이 주어져야한다고 운영 체제에 알립니다. 그리고 시간이 끝나면 운영 체제에 백그라운드 작업을 중단하라고 지시합니다. 그래서 앱이 실제로 프로세스를 완료하는 데 필요한 시간이 아무리 적 으면 백그라운드로 이동할 때마다 앱이 10 분 동안 백그라운드에서 활성 상태로 유지됩니다. 이 시간 동안 앱이 불필요하게 다른 앱의 리소스를 빼앗아갑니다. 그것은 효과가 있지만 나쁜 접근 방법입니다. – rmaddy

+0

이제 코드의 모든 부분에서 (필연적으로 didenterbackground 메서드가 아님) 솔루션에서 작성한 코드를 사용하고 bacgkround 모드에서 peform해야하는 코드를 작성해야합니다. // Perferom 태스크와 if (taskId! = UIBackgroundTaskInvalid) 사이 ... ....? – Piero

관련 문제