ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift - Combine
    Combine 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 를 보낼 수 있다. 

    1. Publisher's generic Output type 을 갖는 output value 
    2. A successful completion. 
    3. 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
Designed by Tistory.