NSTimer 사용하기

프로그래밍을 하다 보면 특정 작업이 몇초, 몇분, 몇시간 후에 실행되는 로직을 원할 때가 있습니다. 이런 경우에 dispatch_after를 사용해서 처리할 수도 있지만, 또 다른 방법으로는 NSTimer를 이용하면 편리하게 구현할 수 있습니다.

// dispatch_after 사용하는 경우
dispatch_time_t waitTime = dispatch_time(DISPATCH_TIME_NOW, CALL_INTERVAL * NSEC_PER_SEC);
dispatch_after(waitTime, dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void) {
    
});

dispatch_after의 경우 NSDictionary형태의 데이터를 넘길 수 없는데 NSTimer는 Dictionary형태의 데이터를 전달할 수 있습니다. 그러면 NSTimer를 사용하는 방법에 대해 알아보도록 하겠습니다.


NSDictionary *userInfo = @{@"USER_NAME":@"Leby.Y.Kim"};
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5
                                                  target:self
                                                selector:@selector(timerHandler:)
                                                userInfo:userInfo
                                                 repeats:NO]; //5초

위 방법처럼 작성하면 NSTimer를 등록하고 메서드가 실행이 됩니다. 설명은 아래와 같습니다.

Interval:5	// 5초 뒤에 실행
target:self	// 현재 클래스
selector:@selector(timerHandler:)	 // 5초 뒤 실행되는 메서드
userInfo:userInfo	// 전달할 Dictionary 데이터
repeats:NO	 // 반복 여부

타이머의 의해 실행되는 메서드 구현

-(void)timerHandler:(NSTimer*)timer
{
    NSDictionary *userInfo = (NSDictionary*)timer.userInfo;
    NSString *value = [userInfo objectForKey:@"USER_NAME"];
    NSLog(@"value: %@", value);
    
    [timer invalidate];
}

timerHandler 메서드에는 userInfo로 받은 Dictionary데이터를 KEY값을 이용해서 가져와 출력합니다.


[timer invalidate]; 타이머가 계속 메모리에 남아있으면 안되니 타이머를 종료하는 메서드입니다.