반응형
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:) 소개
Publisher
가Subscriber
를 받음.Subscription
생성.Subscriber
가Subscription
을 받음. request valuePublisher
작업 시작 (Subscription
을 통해서)Publisher
값 방출 (Subscription
을 통해서)Operators
는 value를 변경함(transform)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 또는 concurrentOperationQueue
: 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 |