본문 바로가기

Combine

[Combine] ViewModel 에서 Input, Output 구현하기 MVVM 구조로 작업을 하다보면 자연스럽게 Input, Output 에 대한 개념을 접하게 됩니다.  그래서 이번 글에선 왜 이런 구조가 필요했고, 어떻게 사용하는지를 알아보려 합니다. 같이 예시로 살펴볼 화면은 인스타그램의 피드입니다.  사용자들은 좋아요를 누르기도 하고 DM을 보낼 수도 있고저장하기 기능도 사용할 수 있게 됩니다. 그러면 댓글 모두 보기를 클릭하게 될 경우엔 어떤 화면이 노출될까요?피드를 덮은 상태로 상위에 댓글View 가 보이게 됩니다. 즉, 사용자가 클릭을 하고(Input), 클릭에 대한 결과로 댓글View가 올라오게 됩니다(Output).(물론, 피드가 셀로 구성되어 있어서 중간에 많은 단계가 있을 수 있겠지만 이번 글에선 간단하게 생각만하고 넘어갑니다..!) 개발을 진행하면서 .. 더보기
[Combine] ViewModel 의 상태변화를 View 에게 알려주고 싶다면 어떻게 해야할까? 오늘은 업무를 진행할때 겪은 어려움을 해결했던 과정에 대해 글을 작성해보려 합니다. 제목 그대로 ViewModel 의 상태변화를 View 에게 알려주고 싶다면 어떻게 해야할까요? @ObservedObject private var contentViewModel: ContentViewModel 이런식으로 @ObservedObject 를 붙여주게 된다면 ViewModel 의 값이 바뀔때 마다 View 가 알 수 있게 됩니다. 그렇다면, ViewModel 안에 또 다른 ViewModel 의 상태 변화를 알고 싶다면 어떻게 해야할까요? final class ContentViewModel: ObservableObject { @ObservedObject var detailViewModel: DetailViewMode.. 더보기
[Combine] SwiftUI 에서는 Publisher 를 어떻게 구독할까? 안녕하세요. 이전 글에서 Publisher, Subscriber 를 구독하는 방법에 대해 알아봤습니다. 이번엔 SwiftUI 에서는 어떻게 구독하는지에 대해 알아보려합니다. 크게 3가지로 알아보겠습니다. 1. onReceive 2. ObservableObject & @Published 3. ViewModifier 사용 1. onReceive onReceive는 SwiftUI 에서 가장 간단한 Publisher 구독 방법이라 볼 수 있습니다. struct ContentView: View { @State private var data: String = "🌧️" private var cancellables: Set = [] let somePublisher = Just("🌈") var body: some Vie.. 더보기
[Combine] Subject 알아보기 (PassthroughSubject / CurrentValueSubject) 이번 글에선 Subject 에 대해 알아보도록 하겠습니다. 공식 문서에도 보이듯 Subject 는 Publisher 프로토콜을 따르는 것을 확인할 수 있습니다. 설명을 살펴보면 Subject 는 스트림에 send(_:) 메서드를 호출해서 값을 주입(inject) 할 수 있는 publisher 라고 작성되어 있습니다. Subject 내부는 어떻게 만들어져 있는지 살펴보면 3가지의 send 메서드가 있는것을 확인할 수 있습니다. 중요한건 value, completion, subscription 을 subscriber 에게 전달하는 것을 확인할 수 있습니다. 그렇다면 subject 라는 것도 프로토콜이니 누군가 채택을 해서 사용할텐데 이를 채택해서 사용하는 것은 CurrentValueSubject, Passt.. 더보기
[Combine] Publisher 와 Subscriber 는 어떻게 연결할 수 있을까? 지난번 글을 통해 간단하게 Combine 이 무엇이고 Publisher, Operator, Subscriber 에 대해 알아봤습니다. 이번엔 좀 더 나아가 어떻게 사용하는지 확인해보겠습니다. Publisher 와 Subscriber 를 연결해주는 보편적인 방법으로는 1. .subscribe 2.sink 3. assign(to:on:) 으로 볼 수 있습니다. sink 는 이전 글에서도 한번 다룬적이 있지만 다시 한번 설명을 위해 작성해보도록 하겠습니다. 1. .subscribe let coupangPublisher = ["요거트","사과","아이폰","에어팟"].publisher class CoupangSubscriber: Subscriber { typealias Input = String typealia.. 더보기
[Combine] Publisher / Operator / Subscriber 알아보기 매번 Combine 관련 글들을 찾아 읽고 잊어버리는 것의 반복되다보니 Combine 을 제가 이해한 방식대로 정리된 글이 있으면 좋을 것 같아 글을 작성하게 되었습니다. 잘못된 점이라던지 궁금한 점이 있다면 알려주세요! Combine 프레임워크는 앱이 이벤트를 처리하는 방법에 대한 선언적 접근 방식을 제공한다고 합니다. 여러 delegate callback 이나 완료 핸들러 클로저로 구현하는 것이 아닌 특정 이벤트 소스에 대한 단일 처리 체인을 제공한다고 합니다. 다음으로는 Combine 의 핵심이라 볼 수 있는 "Publisher, Operator, Subscriber" 에 대해 알아보도록 하겠습니다. 1. Publisher 는 데이터 스트림을 생성하고 이를 구독할 수 있는 인터페이스를 제공해줍니다... 더보기
[Combine] eraseToAnyPublisher 는 무엇이고 어떻게 사용하는걸까? Combine 프레임워크에서 제공하는 eraseToAnyPublisher 가 무엇이고 어떻게 사용하는건지 알아보도록 하겠습니다. 공식문서를 살펴보면 type eraser 를 사용하여 publisher 를 래핑한다고 정의되어 있네요. 그렇다면 type eraser 는 뭘까요? type eraser 는 publisher 유형을 지우고 더 일반적인 형태로 변환하는 프로세스를 가르키는 용어라 생각할 수 있습니다. eraseToAnyPublisher() 를 사용함으로써 다양한 모듈에서 추상화를 유지할 수 있게 해주고 기존 클라이언트에 영향을 주지 않고 기본 구현을 변경할 수 있다는 장점이 있다고 작성되어 있습니다. 아래 코드에 작성되어 있는 예제에서 TypeWithSubject 의 경우 실제 유형인 Passthr.. 더보기