반응형

 

Hacking with Swift 사이트의 강좌 번역본입니다.

 

[원문 : https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-a-timer-with-swiftui]

 

How to use a timer with SwiftUI

 

아마도 타이머나 그 비슷한 것으로 카운트다운(countdown)을 만들어, 정기적으로 코드를 실행하길 원하는 경우에 Timer onReceive()modifier를 사용해야 합니다. 

 

예를들어, 다음 코드는 매초마다 실행하는 타이머 게시자(publisher)를 만들고, 현재 시간으로 라벨을 업데이트 합니다.

struct ContentView: View {
    @State var currentDate = Date()
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

    var body: some View {
        Text("\(currentDate)")
            .onReceive(timer) { input in
                self.currentDate = input
            }
    }
}

 

타이머가 사용자 인터페이스를 업데이트 할 것이기 때문에, 반복실행(runloop)하는 옵션으로 .main을 사용하는 것은 중요합니다. .common모드의 경우, 타이머가 다른 일반적인 이벤트와 나란히 실행하는 것을 허용 합니다 - 예를들어, 스크롤뷰에 있는 텍스트가 움직이는 경우입니다.

 

보다시피, onReceive() 클로져는 input 으로 현재 날짜를 포함해서 전달 됩니다. 위 코드에서 currentDate를 직접 할당하지만, 이전 날짜 이후로 지난 시간을 계산하는데 사용할 수 있습니다. 

 

특별한 카운트다운 타이머나 스톱워치를 만들고자 하는 경우, 남은 시간이 얼마인지 추적하는 상태(state)를 만들어야 하고, 타이머가 실행될때, 감소시킵니다. 

 

예를들어, 다음과 같이 라벨로 남은 시간을 보여주는 카운트다운 타이머를 만들 수 있습니다.

struct ContentView: View {
    @State var timeRemaining = 10
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

    var body: some View {
        Text("\(timeRemaining)")
            .onReceive(timer) { _ in
                if self.timeRemaining > 0 {
                    self.timeRemaining -= 1
                }
            }
    }
}

 

반응형
Posted by 까칠코더
,