2010-02-07 3 views
6

나는 NSTimer를 성공적으로 사용했지만 지금은 문제가 있습니다. 의심 할 여지없이 무언가 어리 석다. 또 다른 눈을 감상하십시오. 디버거를 실행하면 applicationDidFinishLaunching이 호출되지만 트리거는 호출되지 않습니다.NStimer - 여기서 내가 뭘 잘못하고 있니?

-(void) trigger:(NSTimer *) theTimer{ 
    NSLog(@"timer fired"); 
} 

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger) userInfo:nil repeats:YES]; 

    [window makeKeyAndVisible]; 
} 
+0

아래에서 설명한 것과 마찬가지로 가비지 수집을 사용하지 않는 경우 타이머를 유지해야합니다. –

+2

루프를 실행하는 타이머를 추가하면 루프를 유지할 필요가 없습니다. 실행 루프가 루프를 유지한다고 생각합니다. – Jaanus

+0

메소드 서명 오류를 포착 해 주셔서 감사합니다. 또 다른 한가지는 내가 실행 루프를 수동으로 추가 할 필요가없는 scheduledTimerWithInterval을 사용하고 있다는 것입니다. 이 경우에도 나는 예정된 타이머 부분을 잊었다. – morgancodes

답변

13

선택기는 다음 서명이 있어야합니다 : 코드에

- (void)timerFireMethod:(NSTimer*)theTimer 

그래서 당신이

--edit--

@selector(trigger:) 
은 어쩌면 당신은 다른 사람이 어딘가에을하고 필요하지만를 타이머를 실제로 시작하지 않았습니다. 이벤트를 트리거하기 전에 NSRunLoop에 추가해야합니다.

[[NSRunLoop currentRunLoop] addTimer:nst forMode:NSDefaultRunLoopMode]; 

예제를 올바르게 읽으면. 필자는 현재 NSRunLoop에 자동으로 추가하는 init 메소드 만 사용했습니다. 당신은 정말로 누군가 내 게시물에 댓글에 포함 된 개발자 문서를 봐야합니다.

+1

bleh 너무 늦어서, 미안하다 noah :) – willcodejavaforfood

+0

+1 다음은 관련 문서입니다. http://developer.apple.com/mac/library/documentation/cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html # // apple_ref/occ/clm/NSTimer/timerWithTimeInterval : target : selector : userInfo : 반복 : –

+1

: - :는 메소드 이름의 일부입니다. Infact : 하나의 인수를 가진 메소드에 대한 완전히 유효한 메소드 이름입니다. –

1

당신은 타이머, trigger을 제공하고있는 선택, 그것은 어떤 매개 변수를 사용하지 않는 메소드를 호출해야 함을 나타냅니다. 어느

- (void)trigger 
{ 
     // look at me, I don't take any parameters 
     NSLog(@"timer fired"); 
} 

에 타이머 화력 방법을 변경하거나 @selector(trigger:)를 사용하도록 초기 타이머 호출을 변경합니다.

+1

타이머 콜백에는 하나의 인수가 있어야 메서드 이름을 "trigger"로 변경하면 작동하지 않습니다 –

+2

@jib - 아니요. 타이머 콜백 NSTimer 인수없이 잘 작동합니다. 나는 항상 그렇게한다. –

2

두 가지 :

1) 다른 사람이 말하는 것처럼,이 방법은 다음과 같은 서명이 있어야합니다 ..

-(void) trigger:(NSTimer *) theTimer; 

하고 따라서 타이머합니다

nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger:) userInfo:nil repeats:YES]; 

2) 단지 타이머를 만들면 실행되지 않습니다. the documentation says 다음과 같음 :

당신은 addTimer 사용하여 실행 루프로 새로운 타이머를 추가해야합니다 forMode를 :. 그런 다음 초 후에 타이머 이 실행되고 호출이 호출됩니다. 합니다 ( 타이머가 반복하도록 구성되어있는 경우, 이후에 실행 루프에 타이머를 다시 추가 할 필요가 없습니다.)

가 여기 후 모델링 할 수 실제 작동하는 코드 조각입니다. 타이머 생성은 귀하의 것과 동일하지만 runloop에 올바른 방법으로 추가됩니다.

[[NSRunLoop currentRunLoop] addTimer: 
    [NSTimer timerWithTimeInterval:0.1 
          target:self 
          selector:@selector(someSelector:) 
          userInfo:nil 
          repeats:NO] 
           forMode:NSDefaultRunLoopMode]; 
+4

+1이 정확합니다. 또한 실행 된 루프에 타이머를 추가하는'scheduledTimer ...'편리한 메소드를 사용할 수 있습니다. –

0

당신의 문제점은 timerWithTimeInterval:target:selector:userInfo:repeats:는 타이머를 만들지 만 실행 루프에 하지 일정은, 당신이 그것을 스스로 할 가지고 있다는 사실이다.scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

0

하지 메인 스레드에서 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {에 타이머를 시작할 때 나는 문제가 있었 :

그러나, 당신은뿐만 아니라 실행 루프에 타이머를 일정을 만들어이 방법을 사용할 수 있습니다.

dispatch_async(dispatch_get_main_queue(), ^{ 
[self startScheduledTimer]; 
}); 
관련 문제