2011-01-23 7 views
10
내가 만드는 오전

후 반복 소성하지 NSTimer으로 : 일부아이폰 - NSTimer 화재

@property (nonatomic, retain) NSTimer *ncTimer; 

: 나는 내 타이머를 유지하고

ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
              target:self 
             selector:@selector(handleTimer:) 
             userInfo:nil 
              repeats:YES]; 
[ncTimer fire]; 

- (void)handleTimer:(NSTimer *)chkTimer { 
    // do stuff 
} 

타이머가 반복되지 않는 이유. 그것은 한 번만 발사되며 결코 다시는 발사되지 않습니다.

+0

,하지만 그것을 확인하는 것이 가장 나의 부분에 바보 같은 질문입니다 * : * 난 당신이 handleTimer 방법 아무 곳이나 타이머를 무효화하지 않는 가정? –

+0

아니요. 제가 추가해야 할 유일한 것은 viewDidLoad 메서드에서 타이머를 실행하는 것입니다. – Zigglzworth

답변

7

당신은 당신이 당신의 헤더에 속성으로 넣어 가지고 타이머에 할당 할 수 없습니다 선언을 가정

당신이 할 필요가 구성원 개체에 있습니다. 이것은 작동해야합니다 :

self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES];

또한 : 화재 메서드는 타이머를 발생시킵니다. 타이머가 반복되지 않으면 무효화됩니다. 화재를 말한다 선 후,이 추가 : -fire: 방법은 수동으로 한 번 발사


BOOL timerState = [ncTimer isValid]; 
NSLog(@"Timer Validity is: %@", [email protected]"YES":@"NO"); 
+1

"타이머 유효 기간은 : 예"이지만 여전히 운이 없다 ... 타이머가 반복되지 않습니다. 여기에 무슨 문제가있을 수 있습니까? – Zigglzworth

+0

나는 방금 무슨 일이 있었는지 알기 위해 약간의 테스트 응용 프로그램을 만들었고 그것은 자기 자신과 나에게 잘 작동했다. 구현의 상단에 @synthesize ncTimer가 있습니까? –

+0

그래, 내가 그걸 가지고 ... 나는 많은 다른 애플 리케이션에서 잘 해냈어. 그래서 잘 못 알아 냈어. – Zigglzworth

3

ncTimer에 할당하면 retain 속성이 시작되지 않습니다.

self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES] 
+0

자체를 추가했습니다. 하지만 문제가 지속됩니다. – Zigglzworth

34

. 타이머가 시작 반복 할 경우, 당신이 여기

작업 만든 [[NSRunLoop currentRunLoop] addTimer: forMode:]

+14

이것은 정확하지만 실행 루프에 수동으로 추가하는 대신 'NSTimer'' scheduleTimerWith ... 메소드를 사용하는 것이 더 간단합니다 . –

19

mainRunLoop에 타이머를 추가 그것을

있어 사용하여 runloop에 추가해야 당신은 갈 :

목표 C :

self.ncTimer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

스위프트 :

var ncTimer = NSTimer(timeInterval: 2.0, target: self, selector: Selector("handleTimer"), userInfo: nil, repeats: true) 
NSRunLoop.mainRunLoop().addTimer(ncTimer, forMode: NSDefaultRunLoopMode) 
+0

'self.ncTimer' 대신에'NSTimer * ncTimer'를 목표로하지 않습니까? 또한,'addTimer : timer' 대신에'addTimer : ncTimer'라고하지 않겠습니까? 나는 이것을 편집 할 수있는 힘을 가지고 있지만, 당신이해야 할 일에 대해 알고 싶었습니다. – Volomike

+0

나도, 이건 나를 위해 일한하지만'scheduleTimerWithTimeInterval'하지 않았다 – Husam

6

또한이 블록 내부에 코드를 복사 할 수 있습니다.이 블록은 주 스레드에 타이머 생성을 삽입합니다.

이 코드는 그러므로 남아 :

dispatch_async(dispatch_get_main_queue(), ^{ 
    self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
       target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES]; 
});