iOS/Swift + Objective-c

[Swift/Objective-c] 타이머 사용하기, 반복 작업하기 (Timer)

안경 쓴 귀니 2022. 3. 3. 19:09
반응형

타이머(Timer) 사용하는 방법, 타이머 사용해서 반복 작업하는 방법

 

 

타이머는 아래와 같은 상황에 사용합니다.

  1. 일정 시간 이후에 처리할 일이 있을 때
  2. 일정 시간 간격으로 반복해서 처리할 일이 있을 때

 

 

Github Sample

 

  • Swift

https://github.com/eunsuu1015/SwiftSample/tree/master/Timer

 

GitHub - eunsuu1015/SwiftSample

Contribute to eunsuu1015/SwiftSample development by creating an account on GitHub.

github.com

 

 

  • Objective-C

https://github.com/eunsuu1015/ObjCSample/tree/main/Timer

 

GitHub - eunsuu1015/ObjCSample

Contribute to eunsuu1015/ObjCSample development by creating an account on GitHub.

github.com

 

 

API

 

1. 타이머 시작

scheduledTimer(timeInterval:target:selector:userInfo:repeats:)
  • timeInterval: 타이머 실행 시간. 해당 시간 간격으로 메시지(selector)를 보냄
  • target: 타이머가 실행될 때 메시지를 보낼 개체. 일반적으로 self 사용
  • selector : 타이머 실행될 때 보낼 메시지 (func)

selector는 아래와 같이 objective-c 형식으로 선언해야 하며, swift에서는 @objc를 붙여서 선언합니다.

// objective-C
- (void)timerFireMethod:(NSTimer *)timer {
}

// Swift
@objc func timerFireMethod(timer: Timer) {
}
  • userInfo: 사용자 정보. 필요 없는 경우 nil 사용
  • repeats: 타이머를 반복할 것인지 여부. true - 반복, false - 1회

 

2. 타이머 종료

1회만 사용하는 타이머는 종료할 필요가 없지만, 반복되는 타이머는 종료가 필요합니다.

타이머를 종료할 때는 아래와 같이 진행합니다.

1. isValid로 타이머가 유효한지 체크

2. 타이머가 유효한 경우 타이머 중지

invalidate()

 

 

샘플 코드

 

  • Swift
import UIKit

class ViewController: UIViewController {
    
    var timerRepeat: Timer?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        startTimer()
        startRepeatTimer()
    }
    
    // MARK: - 시작
    
    // 1회성 타이머 시작
    func startTimer() {
        let userInfo = "Timer 1"
        Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(timerFire(timer:)), userInfo: userInfo, repeats: false)
    }
    
    // 반복 타이머 시작
    func startRepeatTimer() {
        let userInfo = "Timer 2"
        timerRepeat = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timerFireRepeat(timer:)), userInfo: userInfo, repeats: true)
    }
    
    // MARK: - 실행
    
    // 1회성 타이머 실행
    @objc func timerFire(timer: Timer) {
        print("timerFire!")
        if timer.userInfo != nil {
            print("\(String(describing: timer.userInfo))")  // Timer 1
        }
    }
    
    // 반복 타이머 실행
    @objc func timerFireRepeat(timer: Timer) {
        print("timerFireRepeat!")
        if timer.userInfo != nil {
            print("\(String(describing: timer.userInfo))")  // Timer 2
        }
    }
    
    // MARK: - 종료
    
    // 반복 타이머 종료
    @IBAction func stopRepeatTimer(_ sender: Any) {
        if let timer = timerRepeat {
            if timer.isValid {
                timer.invalidate()
            }
            timerRepeat = nil
        }
    }
    
}
반응형
  • Objective-c
#import "ViewController.h"

@interface ViewController () {
    NSTimer *timerRepeat;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self startTimer];
    [self startRepeatTimer];
}

#pragma mark - 시작

// 1회성 타이머 시작
-(void)startTimer {
    NSString *userInfo = @"Timer 1";
    [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(timerFire:) userInfo:userInfo repeats:NO];
}

// 반복 타이머 시작
-(void)startRepeatTimer {
    NSString *userInfo = @"Timer 2";
    timerRepeat = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFireRepeat:) userInfo:userInfo repeats:YES];
}

#pragma mark - 실행

// 1회성 타이머 실행
-(void)timerFire:(NSTimer*)timer {
    NSLog(@"timerFire!");
    if ([timer userInfo] != nil) {
        NSLog(@"userInfo : %@", [timer userInfo]);  // Timer 1
    }
}

// 반복 타이머 실행
-(void)timerFireRepeat:(NSTimer*)timer {
    NSLog(@"timerFireRepeat!");
    if ([timer userInfo] != nil) {
        NSLog(@"userInfo : %@", [timer userInfo]);  // Timer 2
    }
}

#pragma mark - 종료

// 반복 타이머 종료
-(IBAction)stopRepeatTimer {
    // 타이머 종료
    if ([timerRepeat isValid]) {
        [timerRepeat invalidate];
    }
    timerRepeat = nil;
}

@end

 

반응형