Observable Macro를 사용하게 된다면 UI에 사용되는 데이터에 접근을 MainThread에서 하지 않아도 에러가 발생하지 않습니다.
이것은 기존에 ObservableObject에서는 에러가 발생하여 개발자가 문제를 인지할 수 있었지만 아직까지는 Observable Macro에서 이런 에러를 처리해주지 않고 있습니다.
변경 전
@Observable class ObservableViewModel: ObservableObject {
let database = TitleDatabase()
var title: String = "Starting title"
func updateTitle() async {
title = await database.getNewTitle()
print(Thread.current)
}
}
변경 후
방법1
@MainActor를 사용하여 Main Thread에서 사용될 데이터들이 무엇인지를 정의하고 함수 자체를 Main Thread에서만 작업이 될 수 있게끔 만드는 방법이 있습니다. 이렇게 하면 MainThread에서 작업이 수행되므로 문제가 해결됩니다.
@Observable class ObservableViewModel: ObservableObject {
let database = TitleDatabase()
@MainActor var title: String = "Starting title"
@MainActor
func updateTitle() async {
title = await database.getNewTitle()
print(Thread.current)
}
}
방법2
클로저에서 작업을 @MainActor로 지정하여 Main Thread에서 작업하게끔 만드는 방법도 있습니다.
@Observable class ObservableViewModel: ObservableObject {
let database = TitleDatabase()
@MainActor var title: String = "Starting title"
func updateTitle() async {
Task { @MainActor in
title = await database.getNewTitle()
print(Thread.current)
}
}
}
'SwiftUI' 카테고리의 다른 글
통신을 위한 URLComponents 구성하기 (2) | 2024.06.11 |
---|---|
SwiftUI - 설정창을 만들어 언어 설정하기 (3) | 2024.06.08 |
View의 데이터 RefreshAction으로 새로고침하기 (Refreshable modifier) (0) | 2024.06.05 |
confirmationDialog 로 하단 메뉴 나타나게하기 (0) | 2024.06.03 |
AVFoundation 사용자가 말하는 동안만 녹음하기 (0) | 2024.05.31 |