ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Combine
    Swift 2021. 7. 20. 18:22

    WWDC 2019에서 발표했던 Combine

    최소버전이 ios 13 이기때문에 아직 바로 사용할 순 없지만, 무엇인지 알아보자.

     

    Combine이란?

    https://developer.apple.com/documentation/combine

    Combine은 비동기적인 이벤트 event-processing연산자를 조합함으로써 사용자 정의할 수 있는 프레임워크이다.

    시간에 따라 값을 처리하기 위한 선언적(declarative) API이다.

    발생한 이벤트를 어떻게 가공하고, 소비할지에 초점을 맞춘다.

     

    • Publisher프로토콜은 시간이 지남에 따라 값의 시퀀스를 제공 할 수있는 유형을 선언합니다. Publishers 업스트림 게시자로부터 받은 값에 대해 조치를 취하고 이를 다시 게시하는 연산자(operattors) 가 있습니다.
    • Subscriber에서 요소를 수신할 때 요소에 대해 작동합니다. 게시자는 구독자가 명시적으로 요청한 경우에만 값을 내보냅니다. 이렇게 하면 subscriber code가 연결된 게시자로부터 이벤트를 받는 속도를 제어할 수 있습니다.

    -> Publisher 프로토콜과 Subscriber 프로토콜로 값을 방출하고, 전달받는셈...!

     

    Receiving and Handling Events with Combine

    let pub = NotificationCenter.default
        .publisher(for: NSControl.textDidChangeNotification, object: filterField)
        
    let sub = NotificationCenter.default
        .publisher(for: NSControl.textDidChangeNotification, object: filterField)
        .sink(receiveCompletion: { print ($0) },
              receiveValue: { print ($0) })
              
     let sub = NotificationCenter.default
        .publisher(for: NSControl.textDidChangeNotification, object: filterField)
        .map( { ($0.object as! NSTextField).stringValue } )
        .sink(receiveCompletion: { print ($0) },
              receiveValue: { print ($0) })
              
    let sub = NotificationCenter.default
        .publisher(for: NSControl.textDidChangeNotification, object: filterField)
        .map( { ($0.object as! NSTextField).stringValue } )
        .filter( { $0.unicodeScalars.allSatisfy({CharacterSet.alphanumerics.contains($0)}) } )
        .debounce(for: .milliseconds(500), scheduler: RunLoop.main)
        .receive(on: RunLoop.main)
        .assign(to:\MyViewModel.filterString, on: myViewModel)
        
    // cancel
    sub?.cancel()

     

    RxSwift 와의 비교

    Combine은 Rxswift를 built in framework로 만들어줬다는 평(?)을 받는데 아래 비교 자료를 통해 알아보자.

    https://github.com/freak4pc/rxswift-to-combine-cheatsheet

    Combine은 애플에서 만든 built in framework이다.

    위의 표를 보며 SwiftUI와의 연동이 좋다는것을 알 수 있다.

     

    Combine의 성능

    https://medium.com/flawless-app-stories/will-combine-kill-rxswift-64780a150d89 

    combine의 성능이 좋다는것을 알 수 있는 article

    728x90

    'Swift' 카테고리의 다른 글

    dynamicMemberLookup (+ KeyPath)  (0) 2021.09.23
    ios 웹뷰와 통신 (Native <-> JavaScript 통신)  (0) 2021.07.21
    Swift Swizzling  (0) 2021.07.16
    Swift Async / Await  (0) 2021.07.09
    Swift Thread 처리에 대해 (Operation Queue vs Dispatch Queue)  (0) 2021.07.07

    댓글

Designed by Tistory.