2014-10-16 2 views
0

내 응용 프로그램에서 나는 NSTimer, 그리고 선택기 - (void)TimerCount 있습니다. 또한 정수는 int CountNum이고 0.01 초마다 1 씩 증가합니다 (CountNum = CountNum + 1).타이머를 실행하는 방법 응용 프로그램을 배경으로 생각하거나 종료되었습니다

Timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(TimerCount) userInfo:nil repeats:YES]; 

와 나는 다시 시작 타이머 앱이 종료 생각하거나 배경을 입력합니다. 어떻게해야합니까?

답변

1

으로 끝나면 처리를 계속할 수 없습니다. 백그라운드에서 작동하려면 백그라운드 작업과 같은 것이 있지만 유스 케이스가 보증하지 않는 것처럼 들립니다.증분이 선형이며 계산 가능하기 때문에 시작일을 NSUserDefaults으로 지정할 수 있습니다. 그런 다음 응용 프로그램이 다시 시작될 때 다시 불러 와서 계산을 업데이트 할 수 있습니다.

[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithDouble:[[NSDate date] timeIntervalSince1970]] forKey:@"start_time"]; 
NSNumber *start = [[NSUserDefaults standardUserDefaults] objectForKey:@"start_time"]; 
countNum = ceil([[NSDate date] timeIntervalSince1970] * 100) - ceil([start doubleValue] * 100); 
0

NSuserdefaults를 사용하여 countNum을 저장하면 사용자가 앱을 종료 할 때마다 저장됩니다. 그냥 countNum을 절약 할 수 AppDelegate에 기능 - (void)applicationWillTerminate:(UIApplication *)application {

NSUserDefault *defaults = [NSUser Defaults standardUserDefaults]; 
[defaults setInteger: countNum forKeys:@"ANY_KEY_HERE"]; 
[defaults synchronise]; 

위의 코드로이 부르지 만, 당신은 사용자가 종료 또는 배경으로 갈 때 저장해야합니다.

그리고 사용자가 전경에 올 때 당신은 당신의 countNum에게 생각의

NSUserDefault *defaults = [NSUser Defaults standardUserDefaults]; 
yourCountNum = [default getIntegerForKeys: @"ANY_KEY_HERE"]; 
1

몇 가져 오지하기 위해 호출 할 수 있습니다

  1. 는 일반적으로 당신이가는 타이머를 유지하려고 않을 것입니다. 필요하지 않은 경우 백그라운드에서 앱을 수행하지 않아야합니다. 사용자의 시스템 자원 (배터리, 메모리, CPU주기 등)을 불필요하게 소모합니다.

  2. 나중에 앱이 실행되지 않을 때 (예 : 구현중인 카운트 다운 또는 알람과 같은 기능인 경우) 사용자가주의를 기울여야 할 경우 location notification을 사용하십시오 타이머를 사용하는 것이 아닙니다.

  3. 또한 얼마나 많은 시간이 경과했는지 파악하려는 경우 NSTimer을 사용하는 것이 올바른 해결책이 아닙니다 (특히 초당 100 번 발사하는 경우). 시작 시간을 캡처 한 다음 얼마나 많은 시간이 경과했는지 확인하고 싶다면 나중에 언제든지 현재 시간을 잡고 시작 시간과 비교할 수 있습니다.

    이 방법의 장점은 더 이상이 프로세스를 수행하는 빈도에 신경 쓰지 않는다는 것입니다. UI를 업데이트하는 경우 초당 60 회 호출 할 수 있습니다. 앱이 백그라운드에있는 경우 앱을 포 그라운드로 되돌릴 때까지 아무 것도 할 필요가 없습니다 (단지 영구 저장 장치에 시작 시간을 저장 (예 : NSUserDefaults) 한 다음 앱이 다시 시작될 때 다시 검색하기 만하면됩니다) .

    "카운터"접근 방식에서 "현재 시간대 시작 시간 비교"접근 방식으로 이동하면 최종 사용자 인터페이스가 타이머에서 분리됩니다. 말할 필요도없이 일단 앱을 포 그라운드로두면 타이머가 필요하지 않습니다. 당신이 절대적으로 응용 프로그램이 포 그라운드를 떠날 때 실행할 수있는 타이머가 필요한 경우

,이 (예를 들어, 일부 유한 길이 작업을 완료하는 데 몇 분 요청) 그렇게 할 수있는 방법입니다,하지만 당신이 절대적으로 필요하다면 그렇게 . 카운터를 업데이트하는 중이라면 확실히하고 싶지는 않습니다.