본문 바로가기

SwiftUI

[Combine] PassthroughSubject 안전하게 사용하는 방법 안녕하세요?전역 이벤트를 안전하게 관리하고 디버깅도 쉽게 만들기 위해 고민했던 것을 공유하고자 글 작성합니다. 1. 왜 PassthroughSubject 만으로는 부족할까?PassthroughSubject 는 Combine 에서 이벤트를 외부로 전달할 수 있는 가장 기본적인 도구로 볼 수 있습니다.하지만 직접 노출해서 사용하면 다음과 같은 문제가 생길 수 있습니다. 1. 외부에서 .send() 를 호출 → 의도치 않은 이벤트 발행2. 로깅이나 디버깅의 어려움3. 이벤트 흐름을 추적하거나 테스트하기 힘들어짐4. 중복 구독 / 다중 전송 방지 등의 로직이 흩어짐let subject = PassthroughSubject()subject.send("🚨 외부에서 제한없이 호출 가능") 위와 같은 문제를 해결하기.. 더보기
[SwiftUI] Frame 에 대해 알아봅시다 1. SwiftUI 에서 Frame 이란?- frame 은 뷰의 크기를 제어할 수 있는 수단입니다.- width, height 는 정확한 고정 크기를 설정합니다.- maxWidth, maxHeight 는 최대 크기 제한을 설정하고 뷰가 주어진 공간을 활용하도록 유도 합니다. 2. .frame(maxWidth: .infinity) 의 의미maxWidth: .infinity 는 뷰의 최대 너비를 가능한 한 크게 설정하라는 의미입니다.- 부모 뷰가 허용하는 최대 공간까지 확장됩니다.- 뷰의 내용물이 부모 뷰의 전체 너비를 채우지 않는다면 남은 공간은 여백으로 채워집니다.Text("Hello, SwiftUI!") .frame(maxWidth: .infinity) .back.. 더보기
[Combine] ViewModel 의 상태변화를 View 에게 알려주고 싶다면 어떻게 해야할까? 오늘은 업무를 진행할때 겪은 어려움을 해결했던 과정에 대해 글을 작성해보려 합니다. 제목 그대로 ViewModel 의 상태변화를 View 에게 알려주고 싶다면 어떻게 해야할까요? @ObservedObject private var contentViewModel: ContentViewModel 이런식으로 @ObservedObject 를 붙여주게 된다면 ViewModel 의 값이 바뀔때 마다 View 가 알 수 있게 됩니다. 그렇다면, ViewModel 안에 또 다른 ViewModel 의 상태 변화를 알고 싶다면 어떻게 해야할까요? final class ContentViewModel: ObservableObject { @ObservedObject var detailViewModel: DetailViewMode.. 더보기
[SwiftUI] 데이터 흐름에 대해 알아봅시다 (3/3) (@StateObject 와 @ObservedObject 차이 / @Binding 과 @ObservedObject 차이) 앞선 글에서 SwiftUI 에서 사용하는 프로퍼티 래퍼에 대해 공부했지만 의문이 들었던 점이 몇가지 있어 정리하려합니다. 주관적으로 궁금했던 내용이지만 다른분들께 도움이 되면 좋겠습니다. 1. @StateObject 와 @ObservedObject 는 각각 어떤 상황에서 사용해야하는걸까? 두가지 프로퍼티 래퍼의 공통점은 SwiftUI 뷰에서 데이터의 상태를 관리하고 감시하는데 사용한다는 점입니다. 하지만, 목적과 동작에 대한 차이점이 존재합니다. 1-1. @StateObject SwiftUI 뷰의 수명주기 동안 유지되는 객체입니다. 이 객체는 해당 뷰 내에서 자체적으로 생성되고 관리됩니다. @StateObject 로 선언된 객체는 뷰의 변경 사항에 따라 새로고침되는 것이 아니라 뷰가 다시 로드될 때까지 .. 더보기
[SwiftUI] 데이터 흐름에 대해 알아봅시다 (2/3) (@StateObject, @ObservedObject) 지난번에 이어 SwiftUI 에서 데이터를 관리하는 방법 중 @StateObject, @ObservedObject 에 대해 알아보도록 합시다. 1. @StateObject 정의를 살펴보면 관찰 가능한 객체를 인스턴스화 하는 프로퍼티 래퍼 라고 정의되어 있습니다. 인스턴스화 한다는 것은 '객체를 생성하고 메모리에 할당하는 것' 을 의미합니다. @StateObject 를 사용할땐 단일 정보 소스로 사용하세요. 속성 선언엔 @StateObject 특성을 적용하고 ObserverableObject 프로토콜을 준수하는 초기 값을 제공하여 App, Scene, View 에서 상태 개체를 만듭니다. 뷰에서 생성된 데이터의 상태가 저장될 수 있으니 이렇게 생성된 하나의 데이터를 다른 곳에선 참조하는 식으로 사용하라는 .. 더보기
[SwiftUI] 데이터 흐름에 대해 알아봅시다 (1/3) (@State, @Binding) 안녕하세요. 칸트입니다 🙇🏻 어떤 글을 작성하면 좋을지 생각하다가 최근 SwiftUI 로 작업해야할 일이 생기면서 궁금증이 많아지더라구요. 그래서 정리 겸 글을 작성해보려 합니다. 우선 알아볼 것은 @State 와 @Binding 입니다. 1. @State 정의를 살펴보면 관리하는 값을 읽거나 쓸 수 있는 프로퍼티 래퍼 라고 정의되어 있네요. 그럼 이제 @State 를 어떻게 사용하는지 코드로 확인해봅시다. 객체 선언부에 @State 키워드를 넣게 되면 isPlaying 객체의 값을 저장하게 되고 SwiftUI 가 알아서 이를 관리하게 됩니다. 하지만, 알아두어야 할 것이 isPlaying 값을 사용할때 직접 참조를 하게 되기 때문에 공식 문서를 살펴보면 private 키워드를 사용하여 선언하는 것을 권.. 더보기