2012-06-15 5 views
28

프로젝트에 구현하기 전에 타이머가있는 테스트 응용 프로그램을 만들었습니다. 타이머를 처음 사용했습니다. 그러나 문제는 [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];을 사용하여 타이머를 구현했을 때 작동하지 않는 것입니다. 여기에 내 코드, 인터페이스입니다 :NSTimer timerWithTimeInterval : not working

@interface uialertViewController : UIViewController 
{ 

    NSTimer *timer; 
} 

-(void)displayAlert; 
-(void)hideandview; 
@end 

구현 :

@implementation uialertViewController 
- (void)viewDidLoad { 

    [self displayAlert]; 
    [super viewDidLoad]; 
} 


-(void)displayAlert{ 

    timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(hideandview) userInfo:nil repeats:NO]; 

    alert = [[UIAlertView alloc] initWithTitle:@"testing" message:@"hi hi hi" delegate:nil cancelButtonTitle:@"continue" otherButtonTitles:nil]; 
    [alert show]; 




    [alert release]; 
    alert = nil; 

} 

-(void)hideandview{ 

    NSLog(@"triggered"); 

    [alert dismissWithClickedButtonIndex:0 animated:YES]; 

    [alert release]; 

    [self displayAlert]; 
} 

@end 

가 그럼 난 [NSTimer scheduledTimerWithTimeInterval: target: selector:userInfo: repeats: ];은, 그것은을 노력으로 [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ]; 를 변경가. timerWithTimeInterval:의 문제점은 무엇인가요? 첫 번째 구현에서 어떤 변화가 있습니까? 미리 감사드립니다.

+0

timerWithTimeInterval은 타이머를 생성하지만 시작하지 않으며 스케줄을 지정하지 않습니다. 나는 thats 유일한 차이라고 생각한다 – rooster117

+0

@ rooster117 : 그렇다면 나는 타이머 발사 방법을 호출 할 필요가있다, 나는 정확하다? –

+0

시작하려는 경우 scheduledTimerWithTimeInterval을 호출하십시오. 어느 쪽이든 – rooster117

답변

115

scheduledTimerWithTimeInterval:invocation:repeats:scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:가 자동으로 그들에게 자신을 추가 할 필요가 없습니다 것을 의미 NSRunLoop에 추가됩니다 타이머를 만들 실종되었다. NSRunLoop에 추가하면 화재가 발생합니다.

timerWithTimeInterval:invocation:repeats:

timerWithTimeInterval:target:selector:userInfo:repeats:, 당신은 다음과 같이 코드를 수동으로 실행 루프에 타이머를 추가해야합니다 : 여기에

[[NSRunLoop mainRunLoop] addTimer:repeatingTimer forMode:NSDefaultRunLoopMode]; 

다른 대답은 당신이 자신을 fire를 호출해야하는 것이 좋습니다. 그렇지 않으면 타이머가 실행 루프에 놓이 자마자 호출됩니다.

+0

위대한 설명! 감사! – kev

+2

예약 된 방법을 사용하는 경우에도 명령 줄 유틸리티에서 실행 중이면 적어도 내 경험에 따르면 mainRunLoop을 수동으로 추가해야합니다. [run run run nsrunloop] (http : // hackazach.net/code/2013/08/09/run-run-run-nsrunloop/) – jheld

+0

scheduledTimer는 타이머를 작동시키지 않고이 제안을 완벽하게 수행했습니다. 감사합니다 – hitme

1

차이점은 timerWithTimeInterval 메서드가 아직 실행되지 않은 NSTimer 개체를 반환한다는 것입니다. 타이머를 실행하려면 [timer fire];을 사용해야합니다. 반면에 scheduledTimerWithTimeInterval은 이미 실행 된 NSTimer을 반환합니다.

그래서, 당신의 첫 번째 구현에 당신은 [timer fire];

+4

내 게시물보기'[timer fire]'는 타이머를 "시작"하지 않고 간단히 그 메소드를 호출합니다. 실행 루프를 시작하려면 타이머를 실행 루프에 추가해야합니다. –

+1

와우, 나는 그 사실을 몰랐다. OP는 당신의 대답을 받아 들여야한다. –

+0

그것은 한 번만 작동하지만 연속적인 프로세스에서는 @Joseph Humfrey 코드를 사용합니다. – yazh

2

또한 메인 스레드에 타이머를 추가 할 수 있습니다.

assert(Thread.isMainThread) 
let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(YourSelector), userInfo: nil, repeats: true)