반응형
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
}
}
}
}
반응형
'SwiftUI > Advanced state' 카테고리의 다른 글
How to create custom bindings (0) | 2019.11.20 |
---|---|
How to create constant bindings (0) | 2019.11.19 |
How to use @EnvironmentObject to share data between views (0) | 2019.11.19 |
How to send state updates manually using objectWillChange (0) | 2019.11.19 |
How to use @ObservedObject to manage state from external objects (0) | 2019.11.19 |
What’s the difference between @ObservedObject, @State, and @EnvironmentObject? (0) | 2019.11.19 |