본문 바로가기

난 iOS개발자/Combine

Combine01 개요

728x90

Combine 프레임워크는 지정된 이벤트 소스에 대해 단일 처리 체인을 만들 수 있다.
체인의 각 부분은 이전 단계에서 받은 요소에 대해 고유한 작업을 수행하는 결합 연산자이다.

 

비동기 프로그래밍

begin
  var name = "Tom"
  print(name)
  name += " Harding"
  print(name)
end

-> 단일 스레드에서 실행되므로 결과가 항상 같음

 

--- Thread 1 ---
begin
  var name = "Tom"
  print(name)

--- Thread 2 ---
name = "Billy Bob"

--- Thread 1 ---
  name += " Harding"
  print(name)
end

-> 어떤 스레드가 먼저 실행될지 모르며 결과가 매번 달라질 수 있다.

 

애플의 비동기 프로그래밍

 

1. NotificationCenter
2. Delegate
3. GCD/Operation
4. Closure

 

위 재료들로 비동기 프로그래밍은 가능하지만, 복잡할 수 있다.
문제는 앱이 각각 고유한 인터페이스를 가진 다양한 종류의 비동기 API를 모두 사용하기 때문이다.

Combine은 비동기 코드를 설계하고 작성하기 위해 Swift 공통의 고급언어를 도입한다.

또한 Combine과 SwiftUI는 쉽게 통합될 수 있다.

 

-Combine이 시스템 계층 구조에서 어디에 위치하는지 보여주는 간단한 다이어그램

 

 

Combine이 제공하는 연산자를 사용하면 많은 복잡하고 일반적인 시나리오를 쉽게 해결할 수 있다.

 

Combine과 Rx는 Reactive Streams라고 하는 표준을 구현.
Rx와 몇가지 차이는 있지만 핵심 개념은 같다.

 

Combine 핵심 3요소

1. Publishers
2. operators
3. subscribers

 

Publisher

게시자는 구독자와 같은 하나 이상의 이해당사자(구독관계)에게 시간이 지남에 따라 값을 보낼 수 있는 유형.
모든 게시자는 다음 세 가지 유형의 여러 이벤트를 내보낼 수 있습니다.

 

1. Generic한 Output 출력 값
2. 성공적인 완료
3. 오류가 있는 완료

 

게시자는 값을 내보낼수 있으며 성공적으로 또는 실패로 인해 완료되면 다른 이벤트를 내보내지 않는다.

게시자가 값을 내보내는 방식을 타임라인으로 보자

파란 박스는 방출된 값, 우측 수직선은 스트림 완료

오류처리 기능

Publisher<Int> 는 String 또는 Date를 내보낼 수 없다.
Publisher.Failure 는 게시자가 실패할 경우 던질 수 있는 오류 유형이다. 게시자가 절대 실패할 수 없는 경우 Never 실패 유형을 지정해준다.

 

 

 

Operator

연산자는 동일하거나 새 게시자를 반환하는 프로토콜에 선언된 메서드이다. 
여러 연산자를 차례로 호출하여 효과적으로 연결할 수 있기 때문에 매우 유용하다.

추가로 연산자는 항상 업스트림, 및 다운스트림이라고 하는 입출력을 갖고 있다. 

연산자는 이전 오퍼레이터로부터 받은 데이터 작업에 집중하고 체인의 다음 오퍼레이터에게 출력을 제공합니다. 

 

 

Subscribers

구독자. 체인의 끝에 도달한 이벤트는 모든 구독자로 전달!

구독자는 일반적으로 방출된 출력 또는 이벤트로 “무언가”를 하기 위한 목적을 가진다.

subscribe의 동작으로 화면에 표시, 서버로 전달 같은 행위를 하고 있다.

Combine은 데이터 스트림 작업을 간단하게 만드는 두 가지 기본 구독자를 제공한다.

 

sink: sink를 사용하면 출력 값과 완성을 수신할 코드와 함께 클로저로 제공

let somePublisher = ...
somePublisher.sink {
	// do ...
}

 

assign: 이것을 사용하면 사용자 지정코드 없이 결과출력을 데이터 모델 또는 UI컨트롤의 일부 속성에 Binding하여 키 결로를 통해 화면에 직접 데이터를 표시한다. rx 의  `Bind!`를 생각하면 될듯

let somPublisher = ...
somePublisher.assign( otherUIComponent)
....

 

 

구독

구독을 추가하면 체인의 시작부분에서 Publisher가 활성화 된다. 
잠재적으로 출력을 수신할 구독자가 없는 경우 publisher는 값을 내보내지 않는다.

 

구독은 고유한 사용자 지정 코드와 오류 처리를 사용하여 비동기 이벤트 체인을 한 번만 선언하고 다시 생각할 필요가 없다는 점에서 훌륭한 개념이다. -> 코드가 분산되지 않고 하나의 체인으로 기승전결 표현가능

 

구독을 특별히 메모리 관리할 필요가 없다(Cancellable)

구독자는 모두 Cancellable을 구독한다. 
이는 subscribe코드 모두가 cancellable 개체를 반환함을 의미합니다. 
메모리에서 해당 개체를 해제할 때마다 구독이 취소되고 메모리에서 해당 리소스가 해제된다.
예를 들면 뷰컨트롤러 속성에 구독을 하고 있다가도 사용자가 뷰 스택에서 뷰컨트롤러를 닫을때마다 메모리가 해제되고 구독도 취소된다는 뜻.

 

 

Combine의 이점

Combine은 아키텍처에 영향을 주는 프레임워크가 아니다.
사용자가  Combine을 적용할 때 전부 혹은 전혀 적용하지 않아야 한다는 틀에 박힌 선택을 하지 않아도 된다. 일부 개선이 필요한 부분에 선택적인 적용도 가능한것

 

 

Key Point

- Combine은 시간이 지남에 따라 비동기 이벤트를 처리하기 위한 선언적 반응 프레임워크입니다.

- 비동기 프로그래밍을 위한 도구 통합, 변경 가능한 상태 처리 및 시작 팀 플레이어의 오류 처리와 같은 기존 문제를 해결하는 것을 목표로 합니다.
 
- Combine은 시간 경과에 따라 이벤트를 내보내는 게시자 , 업스트림 이벤트를 비동기식으로 처리 및 조작하는 운영자 , 결과를 소비하고 유용한 작업을 수행하는 구독자 의 세 가지 주요 유형을 중심으로 진행 됩니다.

 

 

 

728x90

'난 iOS개발자 > Combine' 카테고리의 다른 글

eraseToAnyPublisher  (0) 2023.04.20
Combine 변환연산자  (0) 2023.04.02