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)
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ytw_developer