Timer

이세진·2022년 9월 20일
0

iOS

목록 보기
45/46

RunLoop


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을 시켜주면 된다.

Timer


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도 자동으로 작동을 시작한다.

DispatchQueue


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초마다 출력하는 예시이다.

profile
나중은 결코 오지 않는다.

0개의 댓글