
전체 코드에서 MARK: - Timer 이부분에서 추첨까지 남은 시간이
백그라운드나 다른 뷰 넘어갔다오면 멈추는 로직이 있는거야?
있다면 항상 타이머 시간이 흘러가게 하려면 어디 부분을 수정해야해
코드를 분석해보면, 타이머와 관련된 주요 부분들을 살펴볼 수 있습니다:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
timer?.invalidate() // 여기서 타이머를 중지시키고
timer = nil // nil로 설정합니다
}
private func startTimer() {
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
}
현재 코드에서는 다음과 같은 문제가 있습니다:
1. viewWillDisappear에서 타이머를 완전히 중지시킴
2. 일반 Timer를 사용하여 백그라운드에서 동작이 보장되지 않음
해결방법은 다음과 같습니다:
viewWillDisappear에서 타이머를 중지시키지 않도록 수정수정된 코드:
class NumberRecommendViewController: UIViewController {
// 타이머 속성 수정
private var timer: DispatchSourceTimer?
// MARK: - Timer
private func startTimer() {
// 기존 타이머가 있다면 중지
stopTimer()
// DispatchSourceTimer 생성
let timer = DispatchSource.makeTimerSource(queue: .main)
timer.schedule(deadline: .now(), repeating: .seconds(1))
timer.setEventHandler { [weak self] in
self?.updateTimer()
}
timer.resume()
self.timer = timer
}
private func stopTimer() {
timer?.cancel()
timer = nil
}
// viewWillDisappear 제거 또는 수정
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// 타이머 중지 코드 제거
}
// 메모리 해제시에만 타이머 정리
deinit {
stopTimer()
}
}
이렇게 수정하면 다음과 같은 장점이 있습니다:
DispatchSourceTimer를 사용하여 더 정확하고 안정적인 타이머 동작추가로, 앱이 백그라운드에서도 완벽하게 동작하게 하려면 Info.plist에 백그라운드 모드를 추가해야 할 수 있습니다:
<key>UIBackgroundModes</key>
<array>
<string>processing</string>
</array>
이렇게 수정하면 앱이 백그라운드에 있거나 다른 뷰로 이동했다가 돌아와도 타이머가 계속 동작하게 됩니다.