Previously, it was recommended to use the @MainActor
annotation for ObservableObject
implementation.
@MainActor
final class MyModel: ObservableObject {
let session: URLSession
@Published var someText = ""
init(session: URLSession) {
self.session = session
}
}
We could use this as either a @StateObject
or @ObservedObject
:
struct MyView: View {
@StateObject let model = MyModel(session: .shared)
}
By moving to Observation
, I need to the @Observable
macro, remove the @Published
property wrappers and Switch @StateObject
to @State
:
@MainActor
@Observable
final class MyModel {
let session: URLSession
var someText = ""
init(session: URLSession) {
self.session = session
}
}
But switching from @StateObject
to @State
triggers me an error due to a call to main-actor isolated initialiser in a synchronous nonisolated context.
This was not the case with @StateObject
of @ObservedObject
.
To suppress the warning I could :
- mark the initializer as
nonisolated
but it is not actually what I want - Mark the
View
with@MainActor
but this sounds odd
Both solutions does not sound nice to my eye.
Did I miss something here?