iOS/Combine

· iOS/Combine
시퀀스 연산자들은 Publisher자체가 시퀀스라고 보면됨. 시퀀스 연산자들은 개별 방출값이 아닌 Publisher 전체를 다룸. 값 찾기 min() Publisher가 Finish될 때까지 기다렸다가, 최소값만 방출시켜줌. Comparable 프로토콜을 따르는 경우 별도의 파라미터없이 최소값을 찾아줌. var subscriptions = Set() // 1. 숫자를 방출하는 Publisher let publisher = [1, -50, 246, 0].publisher // 2. min 연산자로 최소값을 찾아서 print publisher .print("publisher") .min() .sink(receiveValue: { print("최소값은 \($0)") }) .store(in: &subscript..
· iOS/Combine
반응형 프로그래밍의 핵심 아이디어는 시간에 따른 비동기 이벤트 흐름을 모델링하는 것. Combine에서는 시퀀스가 시간에 따라 값에 반응하고 변환하는 다양한 연산자들을 제공. Time shifting delay(for:tolerance:scheduler:options) (Rx의 delay) Upstream Publisher가 값을 내보낼 때마다 delay 연산자는 잠시 동안 값을 유지한 다음 사용자가 지정한 스케줄러에서 요청한 지연 시간 후에 값을 내보냄. 초마다 하나의 값을 내보내는 퍼블리셔를 만든 다음 1.5초씩 지연시키고 두 타임라인을 동시에 표시하여 비교. import Combine import SwiftUI import PlaygroundSupport var subscriptions = Set(..
· iOS/Combine
Combining Operator을 사용하면 서로 다른 Publisher가 방출한 이벤트를 결합(combine)하고 결합 코드에서 의미 있는 데이터 조합을 만들 수 있습니다. 예를 들어서 사용자 이름, 비밀번호, 체크박스 등의 입력이 필요한 양식의 경우 각각의 Publisher를 조합해서 동작하도록 만들 수 있습니다. 먼저 prepend 연산자 시리즈입니다. prepend는 '앞에 붙이다'라는 뜻처럼 Publisher에서 나오는 값보다 먼저 나오는 값을 지정해줄 수 있습니다. (Rx의 concat과 유사) prepend 연산자 시리즈 prepend(Output...) prepend(Output)는 ... 구문을 사용하여 다양한 값 리스트를 받습니다. 즉, 원래 Publisher와 동일한 출력 타입인 값을..
· iOS/Combine
Publisher가 내보내는 값이나 이벤트를 제한하고 그 중 일부만 소비하고 싶을 때 유용한 Filtering Operator입니다. 💡 Filtering Operator에는 try 접두사가 붙은 유사 Operator(예: filter와 tryFilter)가 있습니다. 유일한 차이점은 끝에서 throw하는 클로저를 제공한다는 것. 클로저 내에서 던지는 모든 오류는 던진 오류와 함께 Publisher를 종료합니다. 여기서는 non-throwing Operator에 대해서만 정리합니다. filter (= RxSwift의 filter) Swift 표준 라이브러리에도 있고 모두가 익숙한 Filtering Operator의 기본입니다. Bool을 반환하는 클로저에 일치하는 값만 전달시킵니다. filter의 예시입..
· iOS/Combine
Operator는 Publisher가 내보내는 value에 대해 작업을 수행하는 메서드입니다. 각 Combine Operator는 Publisher를 반환합니다. 보통 Operator들은 Upstream의 이벤트를 받아서 이를 조작한 뒤, 조작된 이벤트를 소비할 Downstream으로 보냅니다. collect() ( = RxSwift의 toArray()) collect() operator는 여러개의 value 시퀀스를 하나의 배열 결과값으로 변환해줍니다. 아래는 collect() operator를 나타내는 마블다이어그램입니다. 마블다이어그램에 대한 설명은 RxSwift의 그것과 동일하기 때문에 지난글([RxSwift] Lifecycle과 마블다이어그램)로 대체합니다. 아래는 collect()의 예시입니다..
· iOS/Combine
( = RxSwift의 .asObservable()) Subscriber가 Publisher의 어떤 추가적인 세부정보를 알 필요가 없이 Publisher로부터 값만 수신하도록 하고 싶을 수 있습니다. 이럴 때는 .eraseToAnyPublisher() operator를 통해 Subscriber가 AnyPublisher로 인식하도록 만들어줄 수 있습니다. 아래는 예시입니다. var subscriptions = Set() // 1. PassthroughSubject를 생성 let subject = PassthroughSubject() // 2. subject에서 type-erase된 publisher를 생성 let publisher = subject.eraseToAnyPublisher() // 3. type..
· iOS/Combine
Subject는 non-Combine 코드로부터 값을 받아서 Subscriber에게 값을 방출시키는 Publisher입니다. PassthroughtSubject로 value를 전달하는 방식은 명령형 코드를 Combine을 통한 선언형 코드로 연결하는 좋은 방법입니다. (@published를 마킹한 프로퍼티와 유사한 징검다리 역할입니다. non-Combine 코드로부터 값을 받아, sink를 통해 값을 내보낼 수 있죠) PassthroughSubject ( = RxSwift의 PublishSubject) Subject의 가장 기본형입니다. 아래는 우선 커스텀 Subscriber의 예시입니다(Custom Subscriber는 이전글 참조) // 1. Error 타입을 정의 enum MyError: Error..
· iOS/Combine
이전 글([Combine] Publisher, Subscriber, Cancellable)에서 Subscribe하자마자 단일값을 방출하고 Complete시키는 Publisher의 예시로 Just를 작성했었습니다. Future를 사용하면 단일값을 비동기적으로 생성하고 Complete하는 Publisher를 정의할 수 있습니다. 아래는 Int, Never의 Future를 생성하여 반환하는 factory함수입니다. (Never는 failure를 절대 반환하지 않음. 이전글 참조) func futureIncrement( integer: Int, afterDelay delay: TimeInterval) -> Future { } Future를 반환하는 함수 본문을 채워봅니다. 함수 호출부가 전달해 준 afterDe..
· iOS/Combine
아래는 Publisher와 Subscriber 사이의 흐름을 나타내는 UML다이어그램입니다. subscriber가 publisher를 subscribe합니다. publisher가 subscription을 생성해서 subscriber에게 제공합니다. subscriber가 value를 요청합니다. publisher가 value를 보냅니다. publisher가 completion을 보냅니다. 위 흐름에 맞춰서 아래의 Publisher와 Subscriber의 프로토콜을 살펴봅시다. 먼저 Publisher 프로토콜을 살펴보면 아래와 같습니다. public protocol Publisher { // [1] Publisher가 생성할 수 있는 값의 타입 // = Subscriber의 Input이 맞춰야 할 타입 as..
· iOS/Combine
Publisher Publisher Protocol은 Combine의 핵심 중 하나입니다. 시간이 지남에 따라 하나 이상의 Subscriber들에게 일련의 값을 전달할 수 있는 Type에 대한 요구사항을 정의합니다. Publisher는 두 가지 이벤트를 내보냅니다. Element라고 불리는 value Completion이벤트(Success, Failure) 0개 이상의 value를 내보낼 수 있지만 Completion이벤트는 하나만 내보낼 수 있습니다. Completion이벤트를 내보내고 완료되고 나면 더 이상 아무 이벤트도 내보낼 수 없습니다. 가장 간단하게 만들어볼 수 있는 Publisher는 Just입니다. // 1. 단일 값으로 publisher를 생성할 수 있는 Just를 이용하여 publish..
· iOS/Combine
Combine의 핵심 기본요소는 Publishers, Operators, Subscribers. 다른 요소들도 있지만 위 세가지는 필수입니다. Publishers 하나 이상의 Subscriber에게 시간이 지남에 따라 값을 내보낼 수 있는 타입입니다. 수학 연산, 네트워킹, User event 처리를 포함한 거의 대부분의 Publisher의 내부 로직과 관계없이 3가지 타입의 이벤트를 내보낼 수 있습니다. Publisher의 Generic타입의 Output Success 완료 Publisher의 Failure타입의 error가 있는 완료 Publisher는 0개 이상의 Output값을 내보낼 수 있고, 성공 혹은 실패로 완료된 경우 다른 이벤트를 내보낼 수 없습니다. 아래는 시간이 지남에 따라 Int값을..
· iOS/Combine
Combine을 익히려고 보다 보면, RxSwift와 비교를 하면서 익힐 수밖에 없는 듯하여 둘의 핵심요소들의 비교를 정리해 봅니다. (참고: https://github.com/CombineCommunity/rxswift-to-combine-cheatsheet) Basic Spec. RxSwift Combine Deployment Target iOS 8.0+ iOS 13.0+ Platforms supported iOS, macOS, tvOS, watchOS, Linux iOS, macOS, tvOS, watchOS, UIKit for Mac Spec Reactive Extensions (ReactiveX) Reactive Streams (+ adjustments) Framework Consumption ..
· iOS/Combine
아래는 Apple 공식문서의 설명을 번역했습니다. (https://developer.apple.com/documentation/combine) Customize handling of asynchronous events by combining event-processing operators. 이벤트 처리 operator를 결합하여, 비동기 이벤트 처리를 Customize 하는 Framework. Combine framework는 시간 경과에 따른 값 처리를 위한 선언적 Swift API를 제공합니다. 이 값들은 많은 종류의 비동기 이벤트들을 나타낼 수 있습니다. Combine은 publisher가 시간이 지남에 따라 변경될 수 있는 값을 노출하고, subscriber가 publisher로부터 이러한 값들을..
SwiftyCody
'iOS/Combine' 카테고리의 글 목록