안녕하세요. narvis2 입니다.
이번시간에는 iOS에서 비동기를 처리할때 사용되는 Combine에 대하여 알아보고자 합니다.
🍀 Combine
Event처리를 위한 선언적 접근을 합니다.Delegate나Completion Handler구현 대신Event소스에 대한Single processing chain을 만들 수 있습니다.Apple버전의RxSwift- 시간의 흐름에 따라 값을 처리하기 위한
Declarative Swift API를 제공하는 프레임워크 - ✅
Combine으로 할 수 있는 대표적인 작업- 1️⃣ 필드에 입력한 값이 유요한 경우에만
Submit버튼이 활성화되도록 설정 - 2️⃣ 비동기작업을 수행하고 반환된 값을 사용하여
View를Update할 방법과 대상을 선택할 수 있음 - 3️⃣ 사용자가 텍스트필드에 동적으로 입력하고 입력한 내용을 기반으로 사용자 인터페이스
View를Update함
- 1️⃣ 필드에 입력한 값이 유요한 경우에만
- ✅ 장점
- 1️⃣
System Level에 통합되어 있음. - 2️⃣
delegate,closure를 만들 필요 없음. - 3️⃣ 동일한
interface를 쓰기 때문에 재사용성이 좋음. - 4️⃣
operator를 조합하기 좋음. - 5️⃣ 비동기 코드에서도 비즈니스 로직에 집중할 수 있음.
- 1️⃣
- ✅
Combine의 3가지 주요 부분PublisherOperatorSubscriber
- ✅
Key pointsCombine은 비동기Event를 위한 선언적, 반응형 프레임워크- 비동기 프로그래밍의 기존 문제를 해결하는 것이 목표
- 주요 3 타입 흐름 :
publisher(Event발행) 👉operator(Event처리, 조작) 👉subscriber(결과물 소비)
☘️ Publisher
value들을 내보내는(emit) 역할Publisher가emit할 수 있는Event종류- 1️⃣
Output - 2️⃣
Completion:successful completion - 3️⃣
Failure:completion with an error
- 1️⃣
✅ 참고
Publisher는Output을 안보내고 있거나 여러번 보낼 수 있으며,Completion이나Failure를 한번 보내고 나면 더 이상의Event를 보낼 수 없음- 구독이 없는 경우
Publisher는 데이터를 제공하지 않음
- ✅ 특징
- 1️⃣ 3가지
Event로 모든 종류의 동적 데이터를 표현 가능 - 2️⃣
delegate를 추가하거나completion callback주입이 필요 없음 - 3️⃣
Publisher는error handling이 내장 - 4️⃣
Publisher는 2개의Generic을 기반으로 구성Generic첫 번째Publisher.Ouput👉output valueGeneric두 번째Publisher.Failure👉Error전달,Error가 발생할 일이 없으면,Never라는type으로 정의하면 됨
- 1️⃣ 3가지
☘️ Operator
Event를 처리하고, 조작하는 역할PublisherProtocol에 선언되어 있음- 같거나 새로운
Publisher를 반환하는 메소드 Operator를 체이닝해서 사용할 수 있기 때문에 유용함- ✅ 장점
- 1️⃣
Operator들은 독립적이고 조합가능 하기 때문에, 복잡한 로직을 구현하는데 조합(Combine) 가능. - 2️⃣ 항상
Input & Output(Upstream & DownStream)을 가지기 때문에shared state를 피할 수 있음.즉, 동시성 이슈로 인해 비동기 코드가 끼어들어 데이터를 중간에 변경할 일이 없음
- 1️⃣
☘️ Subscribers
- 결과물을 소비하는 역할
- 전달받은
value나completion event로 작업을 수행 - 모든 구독은
subscriber로 끝남 - ✅ 2개의 내장된
subscriber- 1️⃣
sink👉output value와completion을 받을 수 있는클로저를 제공할 수 있음.receiveCompletion👉stream이 성공, 실패로 종료되었음을 알려줌receiveValue👉 값을 받을 때 실행되는Closure
- 2️⃣
assign👉output을key path를 통해data model의property나UI control에 바로binding할 수 있음.
- 1️⃣
☘️ Subscriptions
publisher,operator,subcriber의 전체chain- ✅ 중요
subscription의 끝에subscriber를 추가 👉chainning의 맨 앞에 있는publisher를 활성화output을 수신해줄subscriber가 없으면publisher는 어떤value도 전달하지 않음
- ✅ 장점
- 1️⃣
Subscription은 비동기Event들의Chain을Custom코드와Error handling과 함께 한번에 선언 가능 - 2️⃣
Full-Combine이면, 앱 전체의 로직을subscription들로 표현 가능 - 3️⃣
Subscription이 한번 선언되고 나면Callback을 호출할 필요 없이System이 다 알아서 해줌
- 1️⃣
☘️ 메모리 관리
CancellableProtocol을 사용해서 메모리 관리Subscriber들은Cancellable을 준수하고 있음Object를 메모리에서 해제 👉 모든subscription은 취소 👉 리소스를 메모리로부터 해제- ✅
subscirber가 더 이상 값을 받을 필요 없을 때cancel()사용❗️
cancel()을 직접 호출하지 않으면,deinit될 때까지 구독됨 - ✅ 장점
- 1️⃣
Subscription의 수명을View Controller같은Object에binding기능 - 2️⃣ 유저가
View Controller를View Stack에서dismiss 👉 subscription취소 해줌
- 1️⃣