let runLoop = RunLoop.main
let subscription = runLoop.schedule(after: runLoop.now, interval: .seconds(2), tolerance: .microseconds(100)) {
print("Timer fired")
}
// 출력값
Timer fired
Timer fired
Timer fired
...
위의 예시에서는 메인 쓰레드에서 2초마다 “Timer fired”를 출력한다. → 무한히 반복
let runLoop = RunLoop.main
let subscription = runLoop.schedule(after: runLoop.now, interval: .seconds(2), tolerance: .microseconds(100)) {
print("Timer fired")
}
runLoop.schedule(after: .init(Date(timeIntervalSinceNow: 3.0))) {
subscription.cancel()
}
// 출력값
Timer fired
Timer fired
특정 시간만큼만 작동시키고 싶다면 위와 같이 cancel을 시켜주면 된다.
let publisher = Timer.publish(every: 2.0, on: .main, in: .common)
Timer 또한 RunLoop 상에서 작동한다.
let subscription = Timer.publish(every: 2.0, on: .main, in: .common)
.autoconnect()
.sink { _ in
print("Timer fired")
}
// 출력값
Timer fired
Timer fired
Timer fired
...
autoconnect()
를 사용하면 구독을 시작 할 때 timer도 자동으로 작동을 시작한다.
let queue = DispatchQueue.main
let source = PassthroughSubject<Int, Never>()
var count = 0
let cancellable = queue.schedule(after: queue.now, interval: .seconds(2)) {
source.send(count)
count += 1
}
let subscription = source.sink {
print($0)
}
// 출력값
0
1
2
...
RunLoop, Timer와 마찬가지로 2초마다 출력하는 예시이다.