Combine 소개

Asynchronous 프로그래밍

  • Combine은 Asynchronous 프로그래밍을 더 쉽고 안전하게 할 수 있게 해준다.
  • 애플은 Asynchronous 프로그래밍을 이미 다음과 같은 것들에서 사용 중이다.

    • NotificationCenter
    • Delegate pattern
    • Grand Central Dispatch
    • Closures
  • Asynchronous 프로그래밍은 다음과 같은 멀티 쓰레드 작업시 필요할 수 있다.
// Thread 1
var name = "Hohyeon"
print(name)

// Thread 2
name = "Moon"

// Thread 1
name += " Moon"
print(name)
  • 이 코드의 name 값이 상황에 따라 Hohyeon Moon이 될 수도 있고
  • Moon Moon 될 수도 있기에 우리는 Asynchronous 프로그래밍이 필요하다.

Combine

  • 애플은 이미 Timer, NotificationCenter, Core Data 등에 Combine API를 적용했고
  • 새로운 SwiftUI 프레임워크에는 Combine을 더 쉽게 적용할 수 있도록 디자인 해놨다.
  • Combine의 계층은 아래 그림과 같다.

combine-introduction

  • Combine의 핵심 요소 3가지는 publishers, operators, subscribers이다.

Publishers

  • Publishers는 다음과 같은 3가지 타입을 emit 할 수 있다.

    • Publisher의 generic Output 타입.
    • 성공적인 completion.
    • Publisher의 generic Failure 타입.
  • 그리고 Publisher는 다음 두 가지 타입에 대해 generic 하다.

    • Publisher.Output
    • Publisher.Failure

Operators

  • Operators는 Publisher protocol에서 선언된 메소드이다
  • 똑같거나 새로운 publisher를 return 해준다.
  • 여러 개의 operators를 호출할 수 있고, 서로 묶어줄 수 있다.
  • 여러 operator이 퍼즐 같이 서로 맞춰지는 것이 최대 장점이다.
  • 하나의 output이 다음 것의 input 타입과 맞아 떨어져야 하기 때문이다.

Subsribers

  • Publisher와 Operator를 통해 온 것들은 subscriber로 마무리된다.
  • Subsribers는 보통 output 값이나 completion 이벤트로 무언가를 한다.

Combine의 장점

  • 기존 코드에 비해 Combine 코드가 좋은 이유가 무엇일까.
  • 우선, Combine은 System Level에서 구현되어 있다.
  • 즉, 애플이 아닌 다른 user는 사용하지 못하는 부분도 사용한다.
  • IBAction이나 delegate 같은 옛 방식을 사용하는 것보다 자동 구현이 많다.
  • 결국, Combine은 필수가 아니지만 우수한 코드를 짜는데 도움을 준다.

관련 글