[TIL]07.04

rbw·2022년 7월 4일
0

TIL

목록 보기
32/97

Combine 간단한 개념들

모바일 개발에서 비동기 작업은 매우 많다 !

  • 사용자의 입력 (버튼 인터랙션)
  • 서버에서 데이터 받아와서 보여주기 (언제 네트워크를 통해 완료될지 모름)

Why Combine ?

  • 효율적인 비동기 처리 !
  • 통합된 비동기 처리 방식이 필요

일관된 방식의 비동기 처리를 할수 있는 API를 Combine으로 제공

Combine OverView

3가지 주요 컴포넌트가 존재

  • Publisher : 생산자, 배출자, 크리에이터, 배설자
  • Subscriber : 구독자, 소비자, 받는 사람
  • Operator : 변경시키는 사람, 마법사, 가공하는 사람

Event Stream (Event Pipeline)

  • Publisher -> Operator -> Subscriber

Publisher

protocol Publisher {
    associatedtype OutPut
    associatedtype Failure: Error

    func subscribe<S: Subscriber>(_ subscriber: S) where S.input == Output
    S.Failure == Failure
}

데이터를 배출하는 친구, Subscriber가 요청 한 것 만큼 data를 제공

내부 메소드인 Just Future가 존재한다.

  • Just : 값을 다룸
  • Future : 함수를 다룸

iOS에서는 자동으로 제공해주는 것들이 존재함

  • Notification Center
  • Timer
  • URLSession.dataTask

Subscriber

protocol Subscriber {
    associatedtype Input
    associatedtype Failure: Error

    func receive(_ input: Input) -> Subscribers.Demand
    func receive(subscription: Subscription)
    func receive(completion: Subscribers.Completion<Failure>)
}
  • Publisher에게 데이터 요청
  • Input, Failure 타입의 정의가 필요
  • Publisher 구독 후, 갯수를 요청함
  • 파이프라인 취소 가능
  • assign, sink 존재
    • assign : Publisher가 제공한 데이터를 특정 객체에 키패스에 할당
    • sink : Publisher가 제공한 데이터를 받을 수 있는 Closure 제공

Subscriber & Publisher Pattern

  1. Subscribrer is attached to Publisher
  2. Publisher sends a Subscription
  3. Subscriber requests N Values
  4. Publisher sends N values or less
  5. Publisher sends Completion

Subscription

Subscriber 가 Publisher에게 연결됨을 나타낸다.

  • Publisher가 발행한 구독 티켓
  • 이것만 있으면 Data 받는게 가능
  • 이게 사라지면, 구독 관계도 사라짐

Cancellable 프로토콜을 따름 -> Subscription 을 통해 연결을 취소 가능

Subject (Publisher)

  • Send(_:) 메소드를 이용해서 이벤트 값을 주입 시킬 수 있는 퍼블리셔
  • 기존의 비동기 처리 방식에서 Combine으로 전환 시 유용하다.
  • PassthroughSubject
    • Subscriber가 달라고 요청하는 순간 부터 받은 값을 전달 한다. 전달한 값을 들고 있지 x
  • CurrentValueSubject
    • Subscriber가 달라고 요청하면, 최근에 가지고 있던 값 전달 후 그때 부터, 받은 값을 전달함. 전달한 값을 들고 있다.

@Published (Publisher)

프로퍼티를 퍼블리셔로 만들어 준다. 클래스에 한해서 사용이 가능하고, $ 를 이용해서 퍼블리셔에 접근이 가능

Operator

  • Publisher에게 받은 값을 가공해서 Subscriber에게 제공
  • Input, OutPut, Failure 타입을 받는데, 타입이 다를 수 있다.
  • 내부 메소드가 매우 많음, (map, filter, reduce, collect, combineLatest...)

Scheduler

  • 이는 언제 어떻게 Closure를 실행할지 정해주는 역할을 한다.
  • Operator에서 Scheduler를 파라미터로 받을 때가 있음 -> 작업에 백그라운드 혹은 메인 스레드에서 진행이 될 수 있게 도와줌. (얘 자체가 스레드는 x)

2가지 Scheduler 메소드 존재

  • Subscirbe(on:)을 이용해서 Publisher가 어느 스레드에서 수행할 지 결정
    • 무거운 ㅈ가업은 메인이 아닌, 다른 스레드에서 작업할 수 있게 도와줌.
  • receive(on:)을 이용해서 Subscriber, Operator 가 어느 스레드에서 수행할 지 결정
    • UI 업데이트 필요한 데이터를 메인 스레드에서 받을 수 있게 도와줌 (e.g 서버에서 가져온 데이터를 UI 업데이트 할 때)
profile
hi there 👋

0개의 댓글