2011-11-16 3 views
0

NSTimer와 함께 NSThread를 사용하고 있습니다.NSTimer scheduledTimerWithTimeInterval : 반복 : NO 선택기 메서드가 여러 번 호출됩니다.

내 코드는이

-(void) checkForRecentAlarm 
{ 
    if ([self.alarmThread isFinished]) 
    { 
     [self.alarmThread cancel]; 
    } 
    self.alarmThread = [[NSThread alloc] initWithTarget:self selector:@selector(startTimerForRecentAlarm) object:nil]; 
    [self.alarmThread start]; 
    //[NSThread detachNewThreadSelector:@selector(startTimerForRecentAlarm) toTarget:self withObject:nil]; 
} 
-(void)startTimerForRecentAlarm 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 
    self.recentAlarmTime = [NSDate date]; 
    self.dbObject = [[RADataBaseModelManager alloc] init]; 
    self.recentAlarmTime = [self.dbObject getMostRecentAlarmTimeFromDB]; 
    if (self.recentAlarmTime) { 
     NSTimeInterval timeIntervalToAlarm = [self.recentAlarmTime timeIntervalSinceNow]; 
     NSRunLoop* runLoop = [NSRunLoop currentRunLoop]; 
     //Fire timer every second to updated countdown and date/time 
     self.RATimer = [NSTimer scheduledTimerWithTimeInterval:timeIntervalToAlarm target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:NO]; 
     [runLoop run]; 
    } 
    [pool release]; 
} 
- (void)timerFireMethod:(NSTimer*)theTimer 
{ 
    [self.RATimer invalidate]; 
    [theTimer invalidate]; 
    self.RATimer = NULL; 
    theTimer = NULL; 
    [self playAlarm]; 
    UIAlertView *alarmAlert = [[UIAlertView alloc] initWithTitle:@"Alarm" message:@"" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:@"Snooze", nil]; 
    [alarmAlert show]; 
    [alarmAlert release]; 
    alarmAlert = nil; 

} 

지금 문제가있는 것처럼, 내 alertbox가 startTimerForRecentAlarm 방법에서 하나의 호출에 두 번 온다. 결과적으로 경고가 두 번 나타나고 내 견해가 고착됩니다.

여기서 어떤 문제가 발생합니까?

하나의 NSTimer를 사용하여 여러 알람 옵션으로 알람을 구현하려고합니다.

도와주세요.

내가 이것을 디버깅 할 때 많은 동시 스레드가 동일한 코드 (UIAlertView)에서 실행되고 있음을 알 수 있습니다.

답변

1

두 번 호출되는 이유는 분명하지 않지만 지나치게 복잡한 방식으로 수행해야하는 것처럼 보입니다.

local notifications에 대해 생각해 보셨나요?

이렇게하지 않으려면 다음과 같이 코드를 리팩토링하면됩니다. 1. 새 이벤트를 추가하십시오. 2. 타이머가 없거나 이벤트 시간이 시간보다 짧으면 그런 다음이 이벤트의 타이머를 설정하십시오. 3. 타이머가 시작되면 다음 이벤트를 확인하고 해당 이벤트의 타이머를 설정합니다 (있을 경우).

+0

답장을 보내 주셔서 감사합니다. 동일한 논리를 구현할 수 있도록 일부 코드 블록을 제안하십시오. –

1

이것은 정말 복잡해 보입니다. 내 일반적인 관찰은 당신이 두 타이머 발사를하면 그것은 당신이 어떤 이유로 두 타이머가 있기 때문입니다.

UIAlertView를 수행하는 스레드가 여러 개있는 경우 주 스레드에서만 UI를 (신뢰할 수있게) 수행 할 수 있기 때문에 또 다른 문제가 발생합니다.

+0

답장을 보내 주셔서 감사합니다. 덜 복잡하게 할 수 있도록 코드를 제안 해주십시오. 제가 iPhone 응용 프로그램 개발에 더 새롭기 때문에 제발. –

+0

지역 알림을 코딩하지 않았지만 알람을 수행하는 완벽한 방법 인 것 같습니다. (그리고 앱이 실행되지 않을 때 뭔가 할 수 있습니다.) 또는 n 개의 다른 알람이있는 경우 n 개의 다른 NSTimers를 만듭니다. 하나의 타이머 만 사용하려고하지 않아도됩니다. 결론적으로 말하자면 절대적으로 필요하지 않는 한 스레드를 피하십시오. 왜냐하면 스레드 된 코드는 항상 올바르게 작동하기 때문입니다. –

+0

사실 저는 경보 음처럼 인터넷에서 스트리밍을 구현하려고합니다. 나는 다음과 같은 가정을 가지고있다. 만약 내가 틀렸다면, 제발 바로 잡아라 ..... 1) 지역 알림 - alertbox가 올 때, 사용자는 응용 프로그램을 열고 스트림을 재생하기 위해 버튼을 탭해야한다. 하지만 나를 위해 그것은 자동으로 재생되어야합니다. 2) 서로 다른 NSTimers는 응용 프로그램 UI 탐색 속도를 늦 춥니 다. 3) 스레드가 없으면 응용 프로그램 UI는 타이머가 시작될 때 막히게됩니다. –