2013-03-21 2 views
4

사용자가 홈 버튼을 누르면 코어 데이터를 저장하려고합니다. -applicationDidEnterBackground:에서이 작업을 수행하려고했지만 전화를받지 못했습니다. 여기에서 코어 데이터를 저장할 수 없거나 작업 완료에 시간이 충분하지 않기 때문일 수 있습니다. 그것은 그러나에서 작동합니까 -applicationWillResignActive: 나는 이것을 수행하는 최고의 대리인 방법이며 왜 -applicationDidEnterBackground:가 작동하지 않는지 궁금합니다. 는사용자가 응용 프로그램을 종료 할 때 코어 데이터 저장?

// CALLS SAVE 
- (void)applicationWillResignActive:(UIApplication *)application { 
    [[self model] saveCoreData:@"SAVE FROM: applicationWillResignActive"]; 
    NSLog(@"APPDEL: %s", __PRETTY_FUNCTION__); 
} 

// DOES NOT CALL SAVE 
- (void)applicationDidEnterBackground:(UIApplication *)application { 
    [[self model] saveCoreData:@"SAVE FROM: applicationDidEnterBackground"]; 
    NSLog(@"APPDEL: %s", __PRETTY_FUNCTION__); 
} 

(당신은 내가 제거하면 두 가지 방법이 호출되고 출력에서 ​​볼 수 있듯이 -applicationWillResignActive: 무에서 저장하는 것은 하나가 다른를 차단하고 해당하지 않는 상황 때문에 전혀 발생).

// CONSOLE OUTPUT 
2013-03-21 cvb[6724:907] APPDEL: -[AppDelegate applicationWillResignActive:] 
2013-03-21 cvb[6724:907] APPDEL: -[AppDelegate applicationDidEnterBackground:] 
2013-03-21 cvb[6724:907] 
2013-03-21 cvb[6724:907] SAVE: SAVE FROM: applicationWillResignActive 
2013-03-21 cvb[6724:907] SAVE: Saving successful ... 

편집 :

이 내가 마지막에 무슨 짓을 :

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 
     [application endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 
    [[self model] saveCoreData:@"[ENTERING BACKGROUND]"]; 
} 
+0

환호성 구오, 너도 나를 때렸어. – fuzzygoat

+0

applicationDidEnterBackground에서 model의 값은 무엇입니까? 나는 그것이 0이 아닌 것으로 추정한다. – occulus

+0

saveCoreData 메서드가 비동기 적으로 작동합니까? 또는 저장을 완료 할 때까지 차단합니까? 저축은 얼마나 걸립니까? – occulus

답변

2

체크 아웃 UIApplicationDelegate protocol reference.

기본적으로,이 당신에게 관심을 가질만한 부분은 약 applicationDidEnterBackground:

당신은이 방법을 종료하지만 (예 : 상태를 저장 등의) 다른 작업을하기 전에 사용자 인터페이스 조정에 관련된 모든 작업을 수행해야합니다 해야한다 필요에 따라 동시 디스패치 대기열 또는 보조 스레드로 이동했습니다. applicationDidEnterBackground에서 시작하는 백그라운드 작업은 가능성이 높기 때문에 메서드가 종료 될 때까지 실행되지 않으므로 작업을 시작하기 전에 추가 백그라운드 실행 시간을 요청해야합니다. 즉, 먼저 beginBackgroundTaskWithExpirationHandler :를 호출 한 다음 디스패치 큐 또는 보조 스레드에서 작업을 실행합니다.

+1

많은 감사를드립니다. – fuzzygoat

관련 문제