-
Combine - 1 BasicCombine 2021. 11. 3. 14:03
1. Combine Basics
Combine 에서 가장 중요한건, publishers, operators, and subscribers 에요.
Combine 엔 물론 다른 요소들도 있지만, 이 세개가 없으면 할 수 있는게 많이 없답니다.
먼저, 이것들의 역할부터 알아보도록 하겠습니다.
1.1 Publishers
Publishers 는, 하나 또는 여러 곳으로 (to subscribers) 값들을 보낼 수 있는 타입입니다.
Publishers 의 내부 로직은 거의 모든 math calculations, networking, handling user events 이지만
모든 publisher 는 아래 세가지 타입들 로 이루어진 여러개의 events 를 보낼 수 있습니다.
1. An output value of the publisher's generic Output type
2. A successful completion
3. A completion with an error of the publisher's Failure type.
A publisher 는 0개 또는 여러개의 output values 를 보낼 수 있고, 끝날 경우(successful or failure) 어떠한 다른 events 도 보내지 못합니다.
Publisher 는 세가지 종류로밖에 데이터를 보낼 수 없지만, 이 세가지가 아주 포괄적이어서 어떠한 데이터라도 이것에 속합니다. 그렇기 때문에 어떤 task 라도 Combine puhlishers 를 통해 다룰 수 있습니다. ( 숫자들, network calls, UI interaction 에 대한 reaction, UI update 등 )
항상 어떤 방법을 사용해서 task 를 처리할 지 결정하는 것 대신 (delegation 과 completion callback 중 어느것을 쓸지) 그냥 publisher 를 사용해서 처리할 수 있어요!
또 한가지 publisher 가 갖는 좋은 점 중 하나는 error handling 을 기본적으로 갖추고 있다는 것이에요.
Publisher protocol 은 두가지 타입에 대해 generic 입니다.
Publisher.Output
publisher 의 output values 의 type 입니다. 만약 publisher 가 Int 로 정해지면, String, Date value 등은 절대 보낼 수 없어요.
Publisher.Failure
publisher 가 fail 했을 때 throw 처리 할 수 있는 error type 입니다. 만약 절대 fail 하지 않는 경우라면, 'Never' 라는 failure type 을 사용하시면 됩니다.
만약 어떤 publisher 에 대해 subscribe 하게되면, publisher 로부터 어떤 값이 나올지, 어떤 error 가 나올지 알 수 있습니다.
1.2 Operators
Operators 는 Publisher protocol 에 선언되어있는 methods 이고, 기존 또는 새로운 publisher 를 return 합니다. 여러개의 operator 을 연달아 붙여 사용할 수 있기때문에 매우 쓸모가 많습니다.
'Operators' 는 분리 및 결합이 매우 용이하기 때문에, 하나의 subscription 에 대해 복잡한 로직을 수행하기 위해 여러개가 'Combined' 되어 사용될 수 있습니다.
operators 는 반드시 순서대로 작동하고, 앞 operator 의 output type 과 그 뒤 operator 의 input type 은 항상 매치될 수 밖에 없도록 만들어졌습니다. (직소퍼즐처럼!)
본인이 operators 의 input, output types 을 맞춰가며 직접 순서를 정할 수 있고, 추가로 operators 는 항상 input 과 output 을 갖습니다. (upstream, downstream 이라 불립니다.) 이것을 통해, state 를 share 하는 것을 방지하는 것이죠. (async 방식에서 자주 발생할 수 있는 문제 중 하나 - shared data 를 다루기 때문에 특정 시점에 자신이 예상하고 있는 값과 다른 값을 가지고 있을 수 있음.. )
Operators 는 바로 전 operator 로부터 받은 값을 처리하고 같은 chain 내 다음 operator 에 주는 것에만 집중합니다. 그렇기 때문에 다른 비동기 'piece' 가 작업중인 값에 끼어들 수 없습니다.
1.3 Subscribers
이제 마지막 subscription chain 까지 도착했습니다. 모든 subscription 은 subscriber 에서 종료되게 됩니다. Subscribers 는 일반적으로 받은 output 이나 completion events 을 이용하여 작업들을 처리합니다.
현재, Combine 은 두 built-in subscribers 를 제공합니다.
1. sink subscriber
sink subscriber 에서는 output values 와 completions 를 이용하여 closures 를 사용할 수 있도록 합니다. 받은 events 들을 통하여 무엇이든 할 수 있습니다.
2. assign subscriber
assign subscriber 는 custom code 없이, data model (또는 UI control) 과 output 을 bind 시킵니다. (key path)
만약 data 에 있어서 다른 도구들이 필요하다면, Combine 은 매우 간단한 여러 protocols 를 사용하기 때문에 custom subscribers 를 직접 만들어 사용하시면 됩니다.(publisher 를 만드는 것보다 훨씬 쉬워요. ) .
Subscriptions
더보기'subscription' 의 여러가지 정의
1. Combine's Subscription protocol
2. its conforming objects
3. complete chain of a publisher, operators and a subscriber.
subscriber 를 subscription 마지막에 추가하면 publisher ( chain 의 처음부분 ) 를 활성화 시키게 됩니다.
'Publishers 는 output 을 받을 subscribers 가 없으면 values 를 내보내지 않습니다. '
asynchronous events chain 과 error handling 을 한번 정의하면 다시 되돌아볼 필요가 없기 때문에, 만약 모든 코드를 Combine 으로 만들면 app의 logic 을 subscriptions 만으로 파악할 수 있게됩니다. 나머지는(데이터간 처리) 시스템이 알아서 해줄테니까요.
Subscription code 가 성공적으로 컴파일되고 본인의 코드에 어떠한 문제도 없다면, 이것으로 완성입니다 ! 이후에는 subscriptions 가 비동기적으로 user gesture, timer 등의 처리를 publisher 가 'fire' 될 때마다 처리해줄겁니다.
여기서 심지어 subscription 에 대한 메모리 처리도 할 필요가 없습니다. Combine 에서 제공하는 'Cancellable' protocol 덕분이죠.
system 에서 제공하는 두 subscribers 가 Cancellable protocol 을 conform 하기 때문에, 이것들은 Cancellable object 를 반환합니다. 그러므로 언제든지 이 object 의 메모리를 해제시켜주면, 모든 subscription 을 취소시키고, 관련된 것들도 함께 메모리 해제합니다.
따라서 subscription 을 view controller 의 property 로 저장시킴으로써 쉽게 subscription 의 lifespan 을 'bind' 시킬 수 있습니다. 이 방식에서 user 가 viewController 를 dismiss 시킬 때마다 properties 를 deinit 시키고, subscription 또한 취소시킵니다.
다른 방식으로는 [AnyCancellable] collection 에 저장하는 방식으로 위 과정을 자동화시킬 수 있습니다. 여기 저장된다면 해당 메모리가 해제될 때 저장된 것들 역시 모두 자동으로 취소되고 해제될 겁니다.
Combine 에서 중요한 포인트들은 아래와 같습니다.
1. 비동기 이벤트를 처리하기 위한 declarative, reactive framework 입니다.
2. asynchronous programming 에 사용되는 것들을 단일화시키고, 변할 수 있는 state 을 다루기 위해 만들어졌습니다.
3. 이를 이루기 위해 세가지가 주로 사용됩니다.
a) publishers: events 를 보냅니다.
b) operators: 들어온 이벤트를 비동기적으로 처리합니다.
c) subscribers: 처리된 결과를 통해 어떤 작업을 수행합니다.
'Combine' 카테고리의 다른 글
Combine_Chap5_CombiningOperators (0) 2021.11.26 Combine_Chap2_Publishers&Subscribers (0) 2021.11.23 Combine_Chap4_FilteringOperators (0) 2021.11.21 Combine_Chap3_TransformingOperators (0) 2021.11.21 Swift - Combine (0) 2021.11.16