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

블로그 메뉴

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

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
cozzin

코찐 기술 블로그

iOS/Combine

[Combine] Chapter 17: Schedulers

2021. 2. 3. 10:52
반응형

Operators for scheduling

  • 2가지 기본 operator가 있음
  • subscribe(on:) subscribe(on:options:)
    create 특정 스케줄러 위에서 subscription을 만들어줌.
    subscription에 대한 설명이 좋은데 start the work 이라 되어 있음.
  • receive(on:) receive(on:options)
    delivers 특정 스케줄러 위에서 value를 전달해줌.

챕터6 Time Manipulation Operators에서도 배운 것들

  • debounce(for:scheduler:options:)
  • delay(fortolerance:scheduler:options:)
  • measureInterval(using:options:)
  • throttle(for:scheduler:latest:)
  • timeout(_:scheduler:options:customError:)

subscribe(on:) 소개

  1. Publisher가 Subscriber를 받음. Subscription 생성.
  2. Subscriber가 Subscription을 받음. request value
  3. Publisher 작업 시작 (Subscription을 통해서)
  4. Publisher 값 방출 (Subscription을 통해서)
  5. Operators는 value를 변경함(transform)
  6. Subscriber는 최종 결과값을 받음
  • 1~3 까지 보통 작업을 요청한 스레드에서 바로 일어남
  • 그러나 subscribe(on:)를 쓰는 순간, 모든 operation 들은 특정 스케줄러에서 작동함

예제


let computationPublisher = Publishers.ExpensiveComputation(duration: 3)

let queue = DispatchQueue(label: "serial queue")

let currentThread = Thread.current.number // 플레이 그라운드의 Main Thread 에서 작동
print("Start computation publisher on thread \(currentThread)")

let subscription = computationPublisher
    .subscribe(on: queue)
    .receive(on: DispatchQueue.main)
    .sink(receiveValue: { value in
        let thread = Thread.current.number
        print("Received computation result on thread \(thread): \(value)")
    })

콘솔 출력

Start computation publisher on thread 1
ExpensiveComputation subscriber received on thread 5 // subscribe(on:)의 영향
Beginning expensive computation on thread 5 // subscribe(on:)의 영향
Completed expensive computation on thread 5 // subscribe(on:)의 영향
Received computation result on thread 1: Computation complete  // receive(on:)의 영향
  • subscribe(on:) 을 통해서 비동기 동작을 실행
  • recevie(on:) 을 통해서 비동기 동작 후 Main 스레드에서 UI 업데이트를 해줄 수 있음

Scheduler implementations

  • 애플은 Scheduler 프로토콜을 구현한 객체를 몇 가지 제공한다.
  • ImmeditaeScheduler: 현재 스레드에서 작동시킴. subscribe(on:) 이나 receive(on:)으로 조작하지 않는 한 작동되는 기본 스케줄러.
  • RunLoop: Foundation의 Thread 객체에 묶여 있음. 묶여있는게 뭘까? 종속적??
  • DispatchQueue: serial 또는 concurrent
  • OperationQueue: work item의 실행을 조절(regulate: 조절, 규제)하는 Queue

ImmediateScheduler

  • 즉시 실행됨: schedule(after:) 같은 거 없음

RunLoop scheduler

  • 대부분 DispatchQueue를 사용하는게 유용하지만, 어떤 경우에서는 RunLoop를 쓰는게 유용할 때가 있음
  • Timer, UIKit, AppKit이 RunLoop 기반으로 작동함
  • User input을 위한 모드를 실행시켜줌
반응형
저작자표시 (새창열림)

'iOS > Combine' 카테고리의 다른 글

[Combine] Chapter 16: Error Handling  (0) 2021.02.01
[Combine 책 정리] Chapter 13: Resource Management  (0) 2021.01.27
[Combine 책 정리] Chapter 12: Key-Value Observing  (0) 2021.01.27
[Combine 책 정리] Chapter 11: Timers  (0) 2021.01.27
[Combine 책 정리] Chapter 10: Debugging  (0) 2021.01.27
    'iOS/Combine' 카테고리의 다른 글
    • [Combine] Chapter 16: Error Handling
    • [Combine 책 정리] Chapter 13: Resource Management
    • [Combine 책 정리] Chapter 12: Key-Value Observing
    • [Combine 책 정리] Chapter 11: Timers
    cozzin
    cozzin
    Software Engineer

    티스토리툴바