반응형
타이머(Timer) 사용하는 방법, 타이머 사용해서 반복 작업하는 방법
타이머는 아래와 같은 상황에 사용합니다.
- 일정 시간 이후에 처리할 일이 있을 때
- 일정 시간 간격으로 반복해서 처리할 일이 있을 때
Github Sample
- Swift
https://github.com/eunsuu1015/SwiftSample/tree/master/Timer
- Objective-C
https://github.com/eunsuu1015/ObjCSample/tree/main/Timer
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
반응형
'iOS > Swift + Objective-c' 카테고리의 다른 글
[Objective-c] NSMutableArray에 CGPoint 넣고 빼기 (NSValue) (0) | 2022.06.15 |
---|---|
[Swift / Obejctive-c] UIView를 UIImage로 변환하기 (render UIView to UIImage) (0) | 2022.06.14 |
[Swift] CustomView 사용하기 (ReusableView, 재사용 가능한 뷰) (0) | 2022.02.26 |
[Swift / Objective-c] 디바이스 모델명, OS 버전 조회 (Device Model, OS Version, iPhone/iPad/iPod) (3) | 2022.02.23 |
[Objective-c] 메일 보내기 (Mail - MFMailComposeViewController) (0) | 2022.01.17 |