2014-05-22 2 views
0

반복되는 '이벤트'를 만드는 사용자를 기반으로 앱을 제작하고 있습니다. 각 Event 객체에는 하루 (typedef NS_ENUM으로 저장 됨)와 시간 (NSDate로 저장 됨) 및 지속 시간 (분을 나타내는 NSInteger)이 있습니다. 각 이벤트는 항상 매주 반복됩니다. 이벤트는 핵심 데이터 관리, 교차 장치 동기화, 데이터베이스에 저장됩니다. 매주 다시 만들 필요가 없도록 재사용 할 수 있도록 설계되었습니다 (따라서 날짜 평일 평일). 이벤트가 완료되면 일부 사용자 통계가 업데이트됩니다.특정 시간에 코드 실행

예를 들어, 월요일에 시작하여 10 분에 시작하여 25 분 동안 지속되는 이벤트를들 수 있습니다. 이 경우 NSDate 표현을 this Monday at 10:25 (문제가되지 않음)로 설정하고이 시점에서 문제가되는 사용자 통계를 업데이트하고 싶습니다.

특정 시간에 코드를 실행하는 가장 좋은 방법은 무엇입니까?

원래는 [[NSDate alloc] initWithFireDate:interval:target:selector:userInfo:repeats:]을 사용하려고 생각했습니다. 그러나 target 개체가 초기화되었는지 확인하고 장치간에 타이머를 동기화하는 것은 어려울 수 있습니다. 즉, 각 타이머가 동시에 (매일, 시간 또는 기간 변경시) 발사되도록 설정되어 있는지 확인하십시오.

나의 두 번째 생각은 앱이 시작될 때 통계를 업데이트하고 현재 시스템 시간을 사용하고 이전 이벤트를 되돌아 보는 것입니다. 그러나 사용자가 앱을 연 상태라면 실시간으로 통계를 업데이트하고 싶습니다.

도움이나 아이디어를 많이 주시면 감사하겠습니다. 나는 또한이 문제를 더 잘 해결하기 위해 모델을 어떻게 바꿀 수 있을지에 대한 아이디어를 공개한다.

미리 감사드립니다.

답변

0

타이머가 작동해야 할 때 응용 프로그램이 포화 상태인지 아닌지 두 가지 상황이 발생할 수 있습니다. NSTimer는 앱이 포 그라운드에있을 때만 실행됩니다 (백그라운드 실행 태스크에서 실행되는 경우와 같이 사소한 예외가 있음). 다음과 같이

당신은이 상황을 처리 할 수있는 :

  • 일정 initWithFireDate을 사용하여 다음 필요한 시간 타이머. 앱이 실행되는 동안 존재할 객체를 대상으로 설정해야합니다. UIApplicationDelegate 또는 다른 싱글 톤 클래스를 사용할 수 있습니다.
  • 앱이 백그라운드로 전환되면 시간이 무효화됩니다.
  • 앱이 포 그라운드로 돌아 오면 앱이 마지막으로 배경에 놓여서 타이머가 작동해야하는지 확인합니다. 그렇다면 통계 업데이트를 실행하십시오. 다음 타이머 작업을 예약하십시오.
  • 타이머가 작동하면 앱이 계속 포 그라운드에 있으므로 통계 업데이트 작업을 실행 한 후 다음 타이머 작업을 예약하십시오.