brunch

You can make anything
by writing

C.S.Lewis

by Tilltue Feb 12. 2021

Swift Combine, 시작하기

Combine 기본 개념

https://developer.apple.com/documentation/Combine

Apple Document 의 Combine 을 보면 다음과 같이 설명된다.

( 번역이 미숙하지만... )


Combine


- 이벤트 처리 연산자들을 통해 비동기 이벤트들을 핸들링 할 수 있게 하는 것


개요


컴파인 프레임워크는 시간에 따른 값 처리 Swift API 를 제공한다. 여기서 값이란, 많은 종류의 비동기 이벤트들이 될 수 있다. 컴바인은 시간에 따른 값을 제공 할 수 있는 publishers 와 publishers 로부터 해당 값들을 받는 subscribers 로 정의 된다.


Publisher 프로토콜은 시간에 따른 값의 흐름을 전달할수 있는 프로토콜이다. Publisher 는 값을 받아 처리하고 다시 전달하는 연산자들을 가진다.


publishers 체인의 끝에서, subscribers 는값을 수신받을때 동작된다. publishers 는 subscribers 가 요청한 경우에만 값을 내보낸다. 이를 통해 우리가 만드는 subscribers 코드는 언제 값을 수신하고, publishers 와 연결될지 정할수 있게 된다.


여러개의 publishers 의 출력을 조합 및 상호 작용하도록 작성할수 있다. 예를 들어, 텍스트 필드 publisher 를 subscribe 하고 이 값의 변화에 따른 url 요청을 할 수 있다. 그 다음 응답을 처리하는 다른 publisher 를 사용하고 앱에 결과를 반영 할 수 있다.


컴바인을 채택해서 이벤트 처리 코드들을 중앙 집중화 하고, (중첩 클로저나, 다른 타입들을 가진 콜백들)과 같은 문제들을 제거하고 코드를 읽기 쉽게 유지 관리 할 수 있다.


여기까지 애플 컴바인 문서의 첫장의 개요 내용이다.

코드의 중앙집중화란? ( Centeralizing Code )
https://www.oreilly.com/library/view/actionscript-the-definitive/1565928520/ch09s12.html


덧붙여, 아래의 링크에서 소개된 내용은 다음과 같다.

컴바인 프레임워크는 앱의 이벤트들을 어떻게 처리할지 선언적 접근 방식을 제공한다.

delegate 콜백을 여러개를 등록해서 처리하거나 여러개의 completion handler 를 이어 처리하는 대신,  주어진 이벤트 소스에 대해 단일 처리 로직을 (위에서의 예시처럼 체인해서) 활용할 수 있다.


https://developer.apple.com/documentation/combine/receiving-and-handling-events-with-combine


예제

아주 간단한 테스트를 통해 Publisher 와 Subscriber 프로토콜에 대해 이해해 보자.


요즘 핫한 클럽하우스를 예제로 방에서 손드는 이벤트를 만들어 보자.



예제 결과

>> jack

>> tom

>> completed


Publisher 프로토콜을 따르는 ClubHouseHandsUp 클래스는 비동기 이벤트를 만들어 subscriber 에게 전달한다. subscriber 가 구독을 시작하면 ( sink ) 이벤트 두개를 만들고 종료된다.


publisher 를 쉽게 만들수 있도록 Combine 에서 제공하는 publisher 들은 아래와 같다.


1. class Future

- 단일 이벤트와 종료 혹은 실패를 제공하는 publisher

위와 같이 사용가능하다.

마지막 예제처럼 Error 가 없이 사용하려면 Never 와 같이 사용하면 되며 이 경우 sink 를 completion 블럭 없이 사용가능하다.


2. struct Just

- 단일 이벤트 발생 후 종료되는 publisher


3. struct Deferred

- 구독이 이뤄질때 publisher 가 만들어 질수 있도록 하는 publisher

defferd 를 만들었을때에 아직 ClubHoseHandUp publisher 가 생성되지 않은걸 볼수 있다.

publisher 가 먼저 만들어 질 필요가 없을때 ( 메모리를 많이 필요로 하거나 할때? ) 사용하면 좋을것 같다.


4. struct Empty

- 이벤트 없이 종료되는 publisher

https://gist.github.com/tilltue/fcbf82f91983a07ec1b38efc71217409


5. struct Fail

- 오류와 함께 종료되는 publisher


6. struct Record

- 입력과 완료를 기록해 후에 다른 subscriber 에서 반복될수 있는 publisher

결과를 보면 make recording 은 한번만 불려진걸 볼 수 있다.

( publisher share 랑은 어떤 차이인지 나중에 알아봐야겠다. )



여기까지 Combine 의 개요, 그리고 기본 publisher 들에 대해 알아봤다.


+ 참고로 보면 좋은 영상

https://developer.apple.com/videos/play/wwdc2019/721/

2019 년 WWDC 에서 발표된 "Combine in Practice" 영상이다.


마침.






브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari