홍로그

Swift Combine 본문

iOS

Swift Combine

성홍민 2023. 5. 27. 12:01

Combine이란?

1. Combine 소개

Combine은 Swift에서 비동기적이고 이벤트 기반의 프로그래밍을 위한 프레임워크다. Combine을 사용하면 데이터 스트림을 표현하고 조작할 수 있으며, 여러 비동기 작업을 조합하고 변환할 수 있다. 

  • Publisher: 데이터를 생성하고, 변환하며, 전달하는 데이터 스트림
  • Subscriber: Publisher로부터 전달된 이벤트나 값에 반응하여 처리하는 구독자
  • Operator: 데이터 스트림을 변환하고 조작하는 연산자
  • Scheduler: 비동기 작업을 관리하고 실행하는 실행 콘텍스트

2. 주요 개념과 활용 방법

2.1 Publisher와 Subscriber

Combine에서 Publisher는 데이터 스트림을 생성하고 전달하는 역할을 한다. Subscriber는 Publisher로부터 전달된 이벤트나 값에 반응하여 처리한다. 이를 통해 데이터의 흐름을 제어하고 비동기 작업을 조합할 수 있다.

  • Just: 단일 값 또는 오류를 생성하는 Publisher
  • Future: 나중에 완료되는 단일 값 또는 오류를 생성하는 Publisher
  • NotificationCenter.Publisher: Notification을 생성하는 Publisher
  • URLSession.DataTaskPublisher: 네트워크 요청을 처리하고 데이터를 생성하는 Publisher
  • Sink: 값 또는 오류를 처리하는 Subscriber
  • Assign: 속성에 값을 할당하는 Subscriber
import Combine

// Publisher의 예시
let publisher = Just("Hello, Combine!")

// Subscriber의 예시
let subscriber = Subscribers.Sink<String, Never>(
    receiveCompletion: { completion in
        // 완료 이벤트 처리
    },
    receiveValue: { value in
        // 받은 값 처리
    }
)

publisher.subscribe(subscriber)

2.2 Operator

Operator는 데이터 스트림을 변환하고 조작하는 역할을 한다. Combine은 다양한 Operator를 제공하여 데이터를 필터링하고 변환하며, 여러 스트림을 조합할 수 있다. 

  • map: 데이터를 변환하는 Operator
  • filter: 조건을 만족하는 데이터만 전달하는 Operator
  • flatMap: 데이터를 다른 Publisher로 변환하고 결합하는 Operator
  • merge: 여러 스트림을 병합하는 Operator
  • combineLatest: 여러 스트림의 최신 값을 조합하는 Operator
import Combine

let numbers = (1...10)

numbers.publisher
    .filter { $0.isMultiple(of: 2) }
    .map { $0 * 2 }
    .sink { value in
        print(value)
    }

2.3 Scheduler

Scheduler는 비동기 작업을 관리하고 실행하는 역할을 한다. Combine은 DispatchQueue, OperationQueue 등의 내장 Scheduler를 제공하며, 커스텀 Scheduler를 구현할 수도 있다. Scheduler를 사용하여 작업을 지연시키거나 특정 큐나 스레드에서 실행할 수 있다.

import Combine
import Foundation

let publisher = Timer.publish(every: 1.0, on: .main, in: .default)
let cancellable = publisher
    .autoconnect()
    .sink { date in
        print(date)
    }

3. Combine의 핵심 기능:

 3.1. 데이터 변형 및 조합

Combine은 데이터의 변형과 조합을 위한 다양한 연산자를 제공한다.

numbers 배열의 각 요소를 2배로 변형한 뒤, 그 값이 5보다 큰 경우에만 출력하는 예시코드:

let numbers = [1, 2, 3, 4, 5]
let publisher = numbers.publisher

publisher.map { $0 * 2 }
    .filter { $0 > 5 }
    .sink { print($0) }

3.2. 비동기 작업 관리

Combine은 비동기 작업을 효율적으로 관리할 수 있도록 도와준다. URLSession을 사용하여 네트워크 요청을 처리하는 예시 코드:

let url = URL(string: "https://api.example.com/data")!
let publisher = URLSession.shared.dataTaskPublisher(for: url)
    .map { $0.data }
    .decode(type: Response.self, decoder: JSONDecoder())

publisher.sink(
    receiveCompletion: { completion in
        // 처리 완료 또는 에러 처리
    },
    receiveValue: { response in
        // 받은 데이터 처리
    }
)

3.3. 에러 처리

Combine은 에러 처리를 위한 메커니즘을 제공한다. 아래는 에러 처리를 하는 예시 코드:

let numbers = [1, 2, 3, 4, 5, "invalid"]
let publisher = numbers.publisher

publisher
    .tryMap { number -> Int in
        guard let validNumber = number as? Int else {
            throw MyError.invalidNumber
        }
        return validNumber * 2
    }
    .sink(
        receiveCompletion: { completion in
            // 처리 완료 또는 에러 처리
        },
        receiveValue: { value in
            // 받은 데이터 처리
        }
    )

4. 결론

Swift Combine은 반응형 프로그래밍을 위한 강력한 도구로, 데이터의 변형, 비동기 작업 관리, 에러 처리 등 다양한 기능을 제공한다.

5. 참고

애플공식문서 - Combine

WWDC - Combine

 

반응형

'iOS' 카테고리의 다른 글

Combine vs Async/Await  (0) 2023.05.29
Swift Async/Await  (0) 2023.05.28
inout / mutating  (2) 2023.05.26
Swift final을 쓰는 이유  (0) 2022.11.01
UIWebView, WKWebView, SFSafariView 차이  (2) 2022.10.25