반응형
안녕하세요 코찐입니다.
아래의 자료를 따라서 공부하고 있습니다.
https://www.raywenderlich.com/books/combine-asynchronous-programming-with-swift/v2.0
타이머 클래스에는 삼형제가 있습니다.
RunLoop, Timer, DispatchQueue
RunLoop
특정 RunLoop 상에서 이벤트를 발생시킬 수 있습니다.
1초마다 한번씩 print 합니다.
let runLoop = RunLoop.main
runLoop.schedule(
after: runLoop.now,
interval: .seconds(1),
tolerance: .milliseconds(100)
) {
print("Timer fired")
}.store(in: &subscriptions)
당연히 subscription을 cancel 시켜버릴 수도 있음
아래 예제에서는 3초 동안만 작업을 수행 후 cancel 됨
let runLoop = RunLoop.main
let subscription = runLoop.schedule(
after: runLoop.now,
interval: .seconds(1),
tolerance: .milliseconds(100)
) {
print("Timer fired")
}
subscription.store(in: &subscriptions)
runLoop.schedule(after: .init(Date(timeIntervalSinceNow: 3.0))) {
subscription.cancel()
}
Timer
이것도 근데 RunLoop 상에서 작동합니다.
main 이랑 current는 어떻게 다르게 써야할지 아직 잘 모르겠습니다.
RunLoop에 대한 공부가 좀 더 필요해보입니다.
let main = Timer.publish(every: 1.0, on: .main, in: .common)
let current = Timer.publish(every: 1.0, on: .current, in: .common)
subscription 시작 할 때 timer도 시작시키는 방법이 있음!
이건 굉장히 실용적인 듯
let subscription = Timer
.publish(every: 1.0, on: .main, in: .common)
.autoconnect()
.scan(0) { counter, _ in counter + 1 }
.sink { counter in
print("Counter is \(counter)")
}
DispatchQueue
RunLoop는 딜레이 될 가능성이 있어서, 디스패치큐를 더 많이 사용할 듯도 합니다.
이것도 1초마다 print 해줍니다.
let queue = DispatchQueue.main
let source = PassthroughSubject<Int, Never>()
var counter = 0
let cancellable = queue.schedule(
after: queue.now,
interval: .seconds(1)
) {
source.send(counter)
counter += 1
}
let subscription = source.sink {
print("Timer emitted \($0)")
}
반응형
'iOS > Combine' 카테고리의 다른 글
[Combine 책 정리] Chapter 13: Resource Management (0) | 2021.01.27 |
---|---|
[Combine 책 정리] Chapter 12: Key-Value Observing (0) | 2021.01.27 |
[Combine 책 정리] Chapter 10: Debugging (0) | 2021.01.27 |
[Combine 책 정리] Chapter 9: Networking (0) | 2021.01.27 |
[Combine 책 정리] Chapter 7: Sequence Operators (0) | 2021.01.22 |