[iOS] @EnvironmentObject

강치우·2023년 12월 21일
3

수입푸드

목록 보기
1/13

@EnvironmentObject

EnvironmentObject는 SwiftUI의 데이터 공유 메커니즘 중 하나다. 이를 통해 앱의 여러 뷰에서 하나의 데이터 소스를 공유할 수 있다. 특히 앱의 다양한 부분에서 동일한 데이터를 사용해야 할 때 유용하다.

@EnvironmentObject의 주요 특징

전역 데이터 공유: @EnvironmentObject는 앱의 다양한 뷰에서 공통으로 사용되는 데이터를 관리하는 데 적합하다. 예를 들어, 사용자 프로필, 설정, 테마 등 앱 전반에서 사용되는 데이터를 처리하는 데 사용된다.

데이터 소스 설정: @EnvironmentObject를 사용하기 위해서는, 먼저 앱의 상위 레벨(예: Scene 또는 WindowGroup)에서 해당 객체를 환경 객체로 추가해야 한다. 이는 .environmentObject() 모디파이어를 사용하여 수행된다.

하위 뷰에서의 접근: 한 번 환경 객체로 추가된 후, 이 객체는 모든 하위 뷰에서 @EnvironmentObject 속성 래퍼를 통해 접근할 수 있다. 이렇게 하면, 별도의 전달 과정 없이도 필요한 데이터에 쉽게 접근할 수 있다.

ObservableObject와의 연계: @EnvironmentObject는 ObservableObject 프로토콜을 채택한 객체와 함께 사용된다. ObservableObject의 @Published 속성이 변경될 때마다, 이를 참조하는 모든 뷰가 자동으로 업데이트된다.

@EnvironmentObject를 사용해 보자

  • 공유하고자 하는 데이터를 담은 클래스나 구조체를 ObservableObject 프로토콜을 채택하여 선언한다.
  • ObservableObject 프로토콜을 채택한 클래스나 구조체 내에서, 변화를 감지하고자 하는 속성 앞에 @Published 속성 래퍼를 사용한다.
  • 환경 객체로 추가: 앱의 최상위 뷰에서 .environmentObject() 모디파이어를 사용하여 공유하고자 하는 객체를 환경 객체로 추가한다.
  • 하위 뷰에서 접근: 하위 뷰에서는 @EnvironmentObject 속성 래퍼를 사용하여 환경 객체에 접근할 수 있다.

코드 예시

import SwiftUI

// 1. ObservableObject 프로토콜을 채택한 클래스 정의
class SharedData: ObservableObject {
    @Published var message: String = "Hello, SwiftUI!"
}

// 2. 환경 객체를 사용하는 뷰
struct ContentView: View {
    @EnvironmentObject var data: SharedData

    var body: some View {
        Text(data.message)
    }
}

// 3. 앱의 최상위 뷰에서 환경 객체 제공
@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(SharedData())
        }
    }
}

이 코드는 SharedData 라는 공유 데이터 객체를 만들고, 이를 앱의 최상위 뷰에서 환경 객체로 추가하여, 하위 뷰에서 사용하는 방법을 보여준다. @Published 속성을 사용하여 message 변수의 변경 사항을 감지하고 UI를 자동으로 업데이트한다.

SharedData 객체가 앱의 최상위에 위치하고, 여러 하위 뷰가 이 데이터에 접근하는 구조를 나타낸다. 각 뷰는 EnvironmentObject를 통해 SharedData 에 있는 message 에 접근하고, 이 데이터가 변경될 때마다 뷰가 업데이트된다.

하위 뷰에서 @EnvironmentObject로 선언된 객체에 접근하려면, 반드시 상위 뷰에서 해당 객체가 제공되어야 한다.
@EnvironmentObject는 앱의 많은 부분에서 공통적으로 사용되는 데이터에 적합하며, 특정 뷰 또는 그 하위 뷰에서만 사용되는 데이터에는 @StateObject나 @ObservedObject가 더 적합할 수 있다.

정리하며

EnvironmentObject를 활용하면 SwiftUI에서 데이터 흐름을 더욱 효율적으로 관리할 수 있다. 데이터를 중앙에서 관리하면서도, 필요한 곳 어디에서나 쉽게 접근할 수 있어 개발 과정이 단순화되고, 유지 보수가 용이해진다.

profile
자허블을 좀 더 좋아하긴 합니다.

0개의 댓글