트러블 슈팅

jeongmuyamette·2025년 2월 19일

TIL

목록 보기
48/72
post-thumbnail

전체 코드에서 MARK: - Timer 이부분에서 추첨까지 남은 시간이
백그라운드나 다른 뷰 넘어갔다오면 멈추는 로직이 있는거야?
있다면 항상 타이머 시간이 흘러가게 하려면 어디 부분을 수정해야해

코드를 분석해보면, 타이머와 관련된 주요 부분들을 살펴볼 수 있습니다:

  1. 현재 타이머 관련 코드의 문제점:
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    timer?.invalidate()  // 여기서 타이머를 중지시키고
    timer = nil         // nil로 설정합니다
}
  1. 타이머 시작 코드:
private func startTimer() {
    timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
}

현재 코드에서는 다음과 같은 문제가 있습니다:
1. viewWillDisappear에서 타이머를 완전히 중지시킴
2. 일반 Timer를 사용하여 백그라운드에서 동작이 보장되지 않음

해결방법은 다음과 같습니다:

  1. viewWillDisappear에서 타이머를 중지시키지 않도록 수정
  2. 백그라운드에서도 동작하는 타이머로 변경

수정된 코드:

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()
    }
}

이렇게 수정하면 다음과 같은 장점이 있습니다:

  1. DispatchSourceTimer를 사용하여 더 정확하고 안정적인 타이머 동작
  2. 백그라운드에서도 계속 동작
  3. 다른 뷰로 이동했다가 돌아와도 타이머가 계속 동작
  4. 메모리 관리가 더 효율적

추가로, 앱이 백그라운드에서도 완벽하게 동작하게 하려면 Info.plist에 백그라운드 모드를 추가해야 할 수 있습니다:

<key>UIBackgroundModes</key>
<array>
    <string>processing</string>
</array>

이렇게 수정하면 앱이 백그라운드에 있거나 다른 뷰로 이동했다가 돌아와도 타이머가 계속 동작하게 됩니다.

0개의 댓글