[iOS] Combine 개념 뿌시기

someng·2022년 10월 31일
1

iOS

목록 보기
16/33

Combine이란?

: 이벤트 처리 연산자들을 통해 비동기 이벤트를 처리할 수 있게 하는 프레임워크

3가지 주요 컴퍼넌트

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

1. Publisher

  • 데이터를 배출

  • 구체적인 Output, Failure 타입 정의

  • 빌트인 Publisher

    • Just: 값을 다룸
    • Future: Function을 다룸
  • iOS에서 자동으로 제공해주는 녀석들

    • NotificationCenter
    • Timer
    • URLSession.dataTask

📌 Subject

: send(_:) 메소드를 이용해서 이벤트 값을 주입할 수 있는 Publisher

  • 기존의 비동기처리 방식에서 Combine으로 전환시 유용
  • 2가지 빌트인 타입
    • PassthroughSubject: Subcriber가 달라고 요청하면, 그때 부터, 받은 값을 전달해주기만 한다. (전달한 값을 들고 있지 않음)
    • CurrentValueSubject: Subcriber가 달라고 요청하면, 최근에 가지고 있던 값을 전달하고, 그때 부터, 받은 값을 전달한다. (전달한 값을 들고 있음)

📌 @Published

: @Published로 선언된 프로퍼티를 퍼블리셔로 만들어준다

  • 클래스에 한해서 사용됨 (구조체에서 사용안됨)
  • $ 를 이용해서 퍼블리셔에 접근할수 있다
class Weather {
    @Published var temperature: Double
    init(temperature: Double) {
        self.temperature = temperature
    }
}

let weather = Weather(temperature: 20)
let subscription = weather.$temperature.sink {
    print ("Temperature now: \($0)")
}
weather.temperature = 25

// Temperature now: 20.0
// Temperature now: 25.0

2. Subscriber

  • Publisher에게 데이터를 요청
  • Input, Failure 타입 정의
  • 빌트인 Subscriber
    • assign: Publisher가 제공한 데이터를 특정 객체의 키패스에 할당
    • sink: Publisher가 제공한 데이터를 받을수 있는 클로져를 제공

📌 Subscription

: Subscriber가 Publisher와 연결됨을 나타내는 녀석. Publisher가 발행한 구독 티켓

  • Cancellable protocol을 따르고 있다
    • Subscription을 통해 연결을 Cancel 할수 있음

3. Operator

  • Publisher 에게 받은 값을 가공해서 Subscriber 에게 제공
  • Input, Output, Failure type 을 받는데 타입이 다를수 있다
  • 다양한 빌트인 Operator
    • map, filter, reduce, collect, combineLatest ....

* Scheduler

: 언제, 어떻게 클로져를 실행할지 정해주는 녀석

  • Operator 에서 Scheduler를 파라미터로 받을때가 있다
    → 작업에 따라서, 백그라운드 혹은 메인스레드에서 작업이 실행될수 있게 도와줌

📌 2가지 Scheduler 메소드

subscribe(on:): Publisher가 어느 스레드에서 수행할지 결정

  • 무거운 작업은 메인스레드가 아닌 다른 스레드에서 작업할수 있게 도와준다
    • ex) 백그라운드 계산이 많이 필요한것, 파일 다운로드해야하는 경우

receive(on:): Operator, Subscriber 가 어느 스레드에서 수행할지 결정해주는것

  • UI 업데이트 필요한 데이터를 메인스레드에서 받을수 있게 도와준다
    • ex) 서버에서 가져온 데이터를 UI 업데이트 할때

📌 일반적인 패턴

let jsonPublisher = MyJSONLoaderPublisher() // Some publisher.

jsonPublisher
    .subscribe(on: backgroundQueue)
    .receive(on: RunLoop.main)
    .sink { value in
		label.text = value
}

출처

패스트 캠퍼스: 왕초보를 위한, 한 번에 끝내는 iOS 앱 개발 바이블

profile
👩🏻‍💻 iOS Developer

0개의 댓글