본문 바로가기
WWDC

WWDC 19 - Introducing Combine

by vapor3965 2021. 6. 19.

목차


    • 세션보면서 정리한 내용입니다. 해석이 잘못된 경우가 있을수있으니 발견하시면 댓글로 남겨주시면 감사하겠습니다🙏🏻

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

     

    Introducing Combine - WWDC 2019 - Videos - Apple Developer

    Combine is a unified declarative framework for processing values over time. Learn how it can simplify asynchronous code like networking,...

    developer.apple.com

     

     


    관련내용

    • 시간에따른 값에대한 통일된 declarative 프레임워크다.
    • 어떻게 간단하게 네트워킹,키발류,노티피케이션,콜백같은 비동기를 간단하ㅔㄱ 할수있을지알아보자.

     

    요약

    • 이 session은 Combine의원리를 알아볼수있었다. 어떻게구현되어있고, 어떻게 작성하는지, 왜 그렇게작성될수있는지, 어떤장점이있는지.
    • publisher, subscriber, operator 로 나뉜다.
    • publisher에서, operator로, subcriber로, 명령형프로그래밍을통해 한줄씩 가능하다!
      • 각 타입을반환하면서, 신기하다.
    • 정말다양한operator, 메소드가많기때문에 적재적소로 골라야한다.

     

     



    비동기적인 인터페이스


    위들은 다양하고, 각각 중요하고, 다른사용케이스를 가진다.

    Combine
    Combine은 위의모든것드를바꾸는것이아닌, 대신 공통적인것들을 발견해싿.

    generic의 장점은 boilerplate code를 많이줄여준다.

    마찬가지로 Combine은 generic의장점을 받을수있다.

    런타임대신 컴파일타임때 에러를 캐치함으로써 type safe이다.

    composition first? - 다같이사용하게되면 훨씬더많은다양한것을할수있따?

    Key Concepts

     

     

    Publishers

    • Combine API의 declarative part
    • 값과 에러를 어떻게 생산할지정의한다.
    • value타입으로, struct를 사용한다
    • Subscriber의 등록을 허락한다.
    • Output, Failure로 구성되어있다.

    • 👍Publisher protocol을 구현하려고하지말고, Subject를 사용하도록해라.

    만약 error을 하지않는다면, Never 타입으로 정의할수있다.
    Output은 value가된다.

    subscribe메서드는 subscriber의 input과 publisher의 output이 같아야한다.

    예제 - NotificationCenter

    • 보는것과마찬가지로, NotificationCenter을 replace하지않고, adapt했읇뿐이다.

    Subscriber

    • publisher가 finite하다면 completion을 포함한다.
    • value에따라 행동하고 변형하기때문에 참조타입을사용한다.
    • 마찬가지로, failure에 never사용가능하다
    • 3개의메서드가있다.
    • Subscription을 받을수있는데, 이는 publisher에서 subscriber로 데이터의 흐름을 어떻게컨트롤할지이다.
    • 또는 Input을받을수있고,
    • Publisher와 finite하게 연결된다면, completion을 받을수있다.

    예제

    • property value를 wiritng할때 에러핸들링할수없기때문에 never로했다.

    종합

    • 하나의 subscription.
    • zero 또는 많은 value.
    • single compeltion

    실제예로 해보자

    Wizard의 grade를 졸업할때 listen 하고싶다.
    하지만, Publisher의 output과, Subscriber의 input이 타입이맞지않기때문에 에러가난다.

    그러므로, Notification에서 Integer로 변환하는 무언가가필요하다.

    Operator

    • Publisher protocol을 adopt하고,
    • declartive 이austj value타입이다.
    • value의 변화의 행동을 describe한다.
    • publisher를 subscribe하고, ( upstream )
    • subsriber에게 send한다. ( downstream )
    • Publisher의 Output, Failure을 적절히 변형시킨다.
      • 굉장히 많은 operator가 있다.
      • Scheduled operations으로, 언제,어디로 할지 정해주는 operator도있다.
        • delay,debounce, throttle, …
      • failure에 관한 operator도 있다.
        • assertNoFailure, retry, catch, …..

    Operator 예제

    • Operator가연결할 upstream과 이니셜라이저되고,
    • upstream의 output을 어떻게 output으로 변환할지를 나타낸다.
    • Map은 failure을 만들지않기때문에 upstream의 failure을 그대로 갖는다.

    그러므로, Map을 통해 convert할게생겼다

    그러므로, 아래와같이, Map 컨버터를 이니셜라이즈하는데,
    publisher를 갖으면서, convert를어떻게할지나타낸다.

    그리고, Map 컨버터로 subscribe하면 오케이!! 타입이맞으니!

    이를 더 간단하게 만드러줄 메서드를해보자.

    • 귀찮은간편한메서드같지만, 이것자체가 비동기적프로그래밍을 만드는 핵심이된다 ?

    더간단하게!

    • 종합하면, 이렇게! linear하게, 하나하나 쉽게이해할수있는 코드로 만들수있게된다.
    • publisher를만들고, Operatior로 만든다음, merlin 객체에 grade프로퍼티에 assign한다.
      • assign을함으로써 subscribe까지한거라는디?!
    • cancellable은 publisher와 subscribers를 teardown할수잇다.

    이러한 Operator API는 Apple굉장히많다

    • filter, reduce, first, seconde . …

    굉장히 많기때문에 무엇을상요할지 잘모르겠지만…
    Combine의 디자인원칙의 핵심을 이해하는것을 강력히추천한다.
    이것이 composition이다.
    적은 많은것을하게할 적은 operator를 제공하기보다는 각각 다른 기능을하는 많은 operator를 제공함으로써 더 쉽게 이해핟록 하고자했다……

     

     

    하나의값만을 비동기로하겠따면, Future,
    여러개의값을 비동기로하겠다면 Publisher.

    • 즉, array와 operator하겟다면, publisher이름으로하라 ?

    아까의 예를 다시들어보면,
    값이없거나, 타입이맞지않다고해서 0을반환하는건 별로좋지않은생각이다.
    그래서 그대신nil을반환하면좋겠다.

    swift4.1에서 소개한 compactMap을 이용하면 nil을반환할수있다.

    익숙한 메서드이름이 담긴 operator을보자.

    • filter를통해 값을 filter할수있고,
    • filter된애들중에서 3명만나타낼수있다.
    • 3명이상받게될경우 upstream을 cancel하고, downstream에게 completion을 send할것ㅇ다.

     

     

    map과 filter은 동기적상황이다.

    그러므로 비동기적인상황에 정말유용한 2개가있다.

    Zip

    이렇게 3개모두다 체크가됐을때, 파란색으로바뀌게하려면! 이때가바로 Zip을 사용한다!

    여러개의 upstream을 하나의 tuple로 input한다.

    • 즉, when/and ( 모든 upstream이 다 충분할때 Subscriber에게 보낸다)!

     

     



    Combine Latest

    3가지다 충족되면 Play가 들어오고, 만약 다시 3가지가충족되지못하면 Play가 꺼져야한다!
    이럴때바로 Combine Latest를 사용한다


    Zip과마찬ㄱ지로 하나의 value로 내보내지만,
    When/or 이다.
    계속 값이 들어오면 그값으로 바꾸어 보낸다.
    마지막값을계속 보관하고있다.

    모두 true면 결과도 true, false면 결과도 false


    네트워킹을포함하여 여러개의비동기처리하고자한다면 Zip
    URLsession에서 data를 JSON Decoder로 변환하고자한다면, Decodee 를 사용하라.

    'WWDC' 카테고리의 다른 글

    WWDC 19 - Optimizing App Launch  (0) 2021.06.22
    WWDC 19 - Combine In Practice  (0) 2021.06.19
    WWDC 20 - App essentials in SwiftUI  (0) 2021.06.19
    WWDC 20 - Data Essentials in SwiftUI  (0) 2021.06.17
    WWDC 20 - Introduction to SwiftUI - (2)  (0) 2021.06.17

    댓글