-
Swift - CombineCombine 2021. 11. 16. 14:04
Section I: Introduction to Combine
Chapter 1: Hello, Combine!
Chapter 2: Publishers & Subscribers
Section II: Operators
Chapter 3: Transforming Operators
Chapter 4: Filtering Operators
Chapter 5: Combining Operators
Chapter 6: Time Manipulation Operators
Chapter 7: Sequence Operators
Chapter 8: In Practice: Project "Collage"
Section III: Combine in Action
Chapter 9: Networking
Chapter 10: Debugging
Chapter 11: Timers
Chapter 12: Key-Value Observing
Chapter 13: Resource Management
Chapter 14: In Practice: Project "News"
Section IV: Advanced Combine
Chapter 15: In Practice: Combine & SwiftUI
Chapter 16: Error Handling
Chapter 17: Schedulers
Chapter 18: Custom Publishers & Handling Backpressure
Chapter 19: Testing
Section V: Building a Complete App
Chapter 20: In Practice: Building a Complete App
Conclusion
Publishers
Publisers 는 시간에 따라 하나 또는 여럿의 parties (subscribers 같은) 에게 값을 보내는 types 이다. 모든 publisher 는 아래 세가지 types 의 여러 events 를 보낼 수 있다.
- Publisher's generic Output type 을 갖는 output value
- A successful completion.
- Publisher 의 Failure type을 갖는 error 에 따른 Completion
A publisher 는 0 개 또는 여럿의 output value 를 뱉을 수 있고, 성공적으로 / failure 로 끝나게 될 경우 어떠한 events 도 더 보내지 않는다. 아래 그림은 publisher 가 Int values 를 뱉는 것을 시간의 흐름에 따라 도식으로 나타낸 것이다.
여기서 파란색 박스는 어떤 시간에 뱉어진 값을 나타낸다. 우측에 있는 세로줄은 성공적인 stream 의 completion 이다. 발생할 수 있는 세가지 이벤트들 (Output, success, failure) 는 범위가 넓어 어떠한 데이터라도 이것으로 나타낼 수 있고, 그렇기 때문에 Combine publisher 를 이용하여 app 내의 어떠한 작업도 처리할 수 있다. (network calls, reacting to User gestures, displaying data)
어떤 일을 처리할 때 어떠한 tool 이 필요할지 찾아보는 것 (delegate? or completion callback?) 대신 그냥 publisher 를 사용하면 된다. Publishers 의 가장 큰 이점중 하나는 error handling 이 내장되어있다는 것이다 ( 선택적으로 끝부분에 더할 수 있는게 아니다. ) Publisher protocol 은 두가지 types 에 대해 generic 이다.
Publisher.Output : publisher 의 output values. 만약 Int 로 정해졌다면, String 이나 Date value 를 뱉을 수 없게된다.
Publisher.Failure : fail 의 경우 publisher 가 throw 할 수 있는 error 의 type. 만약 절대로 fail 할 수 없는 경우라면 Never 를 사용
만약 어떤 publisher 에 대해 subscribe 하면, 어떤 values 가 들어올지, 어떤 errors 를 맞게될 지 알게된다.
Operators
Operators 는 Publisher protocol 에 정의된 methods 이고, 같거나 새로운 publisher 를 반환한다. 연결해서 사용할 수 있기때문에 매우 유용하다. 이 methods 는 'operators' 이기 때문에, 분리 및 서로 연결되기가 매우 쉽고, 하나의 subscription 동안에 아주 복잡한 logic 도 operators 는 잘 조합하면 (combine) 구현할 수 있다. Operators 는 퍼즐조각과 같아서 input Type 과 output Type 이 서로 다르면 잘못된 순서로 조립될 수도 없다.
예측 가능한 방법으로 각 input / output types 과 built-in error handling 을 위치에 맞게 사용하면서 조각들의 순서를 정의해줄 수 있다. 추가로, operators 는 항상 input, output 을 가진다. (upstream, downstream 으로 불리고, shard state 를 갖지 않도록 해준다. )
Operators 는 chain 안에서 '이전' operator 으로부터 받은 data 를 '다음' operator 에게 output 으로 전달하는 데에만 집중하기 때문에, 다른 어떤 비동기 코드가 operators 중간에 끼어들어 데이터를 바꿔버리는 상황이 발생하지 않는다.
Subscribers
드디어 subscription chain 의 마지막에 도착했다: 모든 subscription 은 subscriber 에서 종료된다. Subscribers 는 일반적으로 받은 값, 또는 completion events 를 이용하여 무언가를 한다.
현재 Combine 은 두개의 built-in subscribers 를 가지고 있고, data streams 다루는 것을 직관적으로 만들어준다.
• 'sink' subscriber 를 이용해서 output values 와 completions 을 받는 closure 를 code 에 추가해줄 수 있다. closure 에서 받은 이벤트를 이용하여 어떠한 것이든 할 수 있다.
• 'assign' subscriber 을 이용해서 resulting output 을 data model과 묶거나, UI control 과 묶을 수 있다 ( Binding).( key path를 통함)
데이터를 다르게 처리할 필요가 있을 때는 subscribers 를 직접 만들어주는게 publisher 를 만드는 것 보다 훨씬 쉽다. Combine 은 여러 매우 단순한 protocols 를 사용하고, 따라서 스스로 필요한 것을 만들어 사용할 수 있다.
Subscriptions
Subscription 의 마지막 부분에 subscriber 을 추가하면, chain 의 가장 처음부분에 있는 publisher 가 활성화된다. Publisher 는 output 을 받을 subscribers 가 없는 경우 어떠한 값도 보내지 않는다는 것을 기억하자.
Subscriptions 는 비동기 events chain 을 custom code 로 정의할 수 있도록 해주고, error handling 을 한번만 해도 되도록 도와주기때문에 한번 만들어진 후로는 재고할 필요가 없어진다. 코드를 전부다 Combine 으로 작성할 경우 app 의 모든 logic 을 subscriptions 을 통해 한번만 제대로 만들게 되면 나머지는 시스템이 알아서 모두 처리하게된다.
다시말하면 subscription code 의 compile 이 성공적으로 끝나고, 본인의 code 에 logic issues 가 없다면 끝난 것이다. Subscriptions 는 어떤 user gesture 나 timer, 등이 publisher 를 발동시키게 되면 비동기적으로 각 action 을 취할 것이다. Subscription의 메모리 관리에 대해서도 Cancellable 이라는 Combine 에서 제공하는 protocol 을 이용하면 편하게 관리할 수 있다.
두 system-provided subscribers 가 모두 Cancellable protocol 을 conform 하기때문에, subscription code(e.g. the whole publisher, operators and subscriber call chain) 는 Canccellable object 를 반환한다. 언제라도 object 의 memory 를 해제시키면 전체 subscription 은 취소되고, 여기에 할당된 모든 메모리가 해제된다. 그렇기 때문에 view controller 의 property 로 저장함으로서 쉽게 subscription 의 lifespan 을 bind 시킬 수 있다. 이때 언제라도 view controller 가 view stack 에서 사라지게 되면 모든 properties 는 deinitialize 되고, subscription 은 취소된다.
다른 방식을 사용하여 해당 과정을 자동화 시키기 위해서는 [AnyCancellable] collection property 에 원하는만큼의 subscriptions 를 담으면 된다. 그렇게 하면 property 의 메모리가 해제될 때 모두 자동으로 취소될 것이다.
'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 Combine - 1 Basic (0) 2021.11.03