[UIKit] Combine: Intro

Junyoung Park·2022년 10월 2일
0

UIKit

목록 보기
45/142
post-thumbnail

Getting Started with Combine Framework in Swift - Introduction to Functional Reactive Programming

Combine: Intro

Combine

  • Publisher부터 Subscriber까지 이어지는 데이터 스트림을 결합
  • input 형식과 output 형식 존재, 각 모듈은 퍼블리셔부터 섭스크라이버까지 연결되는 일종의 블럭
  • input, output, failure 경우 등을 조합한 AnyPublisher 사용 가능

Publisher

  • Passthroughsubject
  • Currentvaluesubject
  • @Published
  • Just
  • Future
  • Notification Publisher
  • URLSession Publisher

Subscriber

  • sink
  • assign(on, to)
  • assign(on)
  • 퍼블리셔로부터 이어지는 데이터 스트림을 구독하는 마지막 단계
  • 데이터 변화에 따른 UI 패치 이벤트가 일어나는 단계

핵심 코드

import UIKit
import Foundation
import Combine

var cancellables = Set<AnyCancellable>()
var subscription: Cancellable? = Timer.publish(every: 0.1, on: .main, in: .common)
    .autoconnect()
    .throttle(for: .seconds(1), scheduler: DispatchQueue.main, latest: true)
    .scan(0, { count, output in
        return count + 1
    })
    .filter {$0 > 2 && $0 < 100}
    .sink { output in
        print("Finished stream with \(output)")
    } receiveValue: { value in
        print("Received value \(value)")
    }

RunLoop.main.schedule(after: .init(Date(timeIntervalSinceNow: 5))) {
    print("Cancel Subscription")
//    subscription.cancel()
    subscription = nil
}
  • Timer 퍼블리셔를 사용한 Combine 예제
  • 0.1초마다 타이머 체크되는 데이터 스트림 시작
  • throttle을 통해 타이머가 0.1초마다 오더라도 1초 단위로 걸러주기
  • scan을 통해 들어오는 데이터의 개수 카운팅
  • filter를 통해 값 필터링 가능
  • sink를 통해 들어오는 데이터를 사용, UI 패치 등에 사용하기
  • publish로 발행된 데이터 스트림이 sink 단위로 이어질 때 개발자의 사용 목적에 따라 map, flatMap 등 다양한 고차 함수 사용 가능
  • 네트워킹 필요한 비동기 데이터를 처리할 때에는 receive를 통해 어떤 스레드에서 받을 것인지 결정할 수 있음
  • cancel, nil로 주기 등 구독 취소 가능
profile
JUST DO IT

0개의 댓글