cozzin
코찐 기술 블로그
cozzin
전체 방문자
오늘
어제
  • 분류 전체보기
    • Kotlin
    • 백엔드
    • iOS
      • Swift
      • SwiftUI
      • Combine
      • Architecture
    • 개발환경
    • 세미나
    • 생각정리
    • 스터디
    • CS
      • Refactoring
      • OS

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • LinkedIn
  • 강의

공지사항

인기 글

태그

  • 컴퓨터공학
  • 디자인패턴
  • XCode
  • 워닝제거
  • darkmode
  • 리팩토링
  • os
  • Warning
  • Swift
  • multicast
  • 운영체제
  • SwiftUI
  • 테스트
  • WWDC
  • slide-over
  • ios
  • Ribs
  • Combine
  • CS
  • WWDC21

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
cozzin

코찐 기술 블로그

[Combine 책 정리] Chapter 11: Timers
iOS/Combine

[Combine 책 정리] Chapter 11: Timers

2021. 1. 27. 15:26
반응형

안녕하세요 코찐입니다.

아래의 자료를 따라서 공부하고 있습니다.

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
    'iOS/Combine' 카테고리의 다른 글
    • [Combine 책 정리] Chapter 13: Resource Management
    • [Combine 책 정리] Chapter 12: Key-Value Observing
    • [Combine 책 정리] Chapter 10: Debugging
    • [Combine 책 정리] Chapter 9: Networking
    cozzin
    cozzin
    Software Engineer

    티스토리툴바