Creé una clase llamada "AudioPlaybackManager", que es una clase MainActor como StateObject cuando se inicia la aplicación. Estoy recibiendo esta advertencia. ¿Cómo puedo solucionar esto?
@main struct Pro_Music_2App: App { @StateObject var audioPlaybackManager = AudioPlaybackManager() //This line is giving warning to me @StateObject var dataController = DataController() var body: some Scene { WindowGroup { ContentView() .environmentObject(audioPlaybackManager.manager) .environmentObject(audioPlaybackManager) .environmentObject(audioPlaybackManager.manager.playlistManager) .environmentObject(audioPlaybackManager.musicPlayerViewManager) .environmentObject(audioPlaybackManager.scrubberViewModel) .environment(\.managedObjectContext, dataController.container.viewContext) } } } @MainActor class AudioPlaybackManager: ObservableObject { ... }La solución sugerida es no proporcionar ningún valor predeterminado a la propiedad y, en su lugar, establecer su valor en el inicializador.
Consulte las notas de la versión de Xcode en Swift 5.6 -> Problemas resueltos.
Para su código, la solución es así:
@main struct Pro_Music_2App: App { @StateObject var audioPlaybackManager: AudioPlaybackManager @StateObject var dataController = DataController() init() { self._audioPlaybackManager = StateObject(wrappedValue: AudioPlaybackManager()) } var body: some Scene { WindowGroup { ContentView() .environmentObject(audioPlaybackManager.manager) .environmentObject(audioPlaybackManager) .environmentObject(audioPlaybackManager.manager.playlistManager) .environmentObject(audioPlaybackManager.musicPlayerViewManager) .environmentObject(audioPlaybackManager.scrubberViewModel) .environment(\.managedObjectContext, dataController.container.viewContext) } } } @MainActor class AudioPlaybackManager: ObservableObject { ... } El problema subyacente es que los inicializadores no son async . Por lo tanto, no puede saltar entre diferentes actores. Y dado que el compilador sintetiza un inicializador para los valores predeterminados, esto también afecta los valores predeterminados. Es decir, si, por ejemplo, su DataController se anotó con un actor global diferente a @MainActor , entonces el inicializador tuvo que saltar entre @MainActor y cualquier actor que esté usando en DataController . Eso, sin embargo, es imposible porque init no puede ser async .
Supongo que sería difícil implementar esta verificación de un solo actor para los valores predeterminados de las propiedades almacenadas en el compilador, por lo tanto, simplemente decidieron no permitir los valores predeterminados protegidos por el actor en este contexto. Como resultado, tenemos que escribir el inicializador nosotros mismos.
Para referencia, consulte: https://github.com/apple/swift-evolution/blob/main/proposals/0327-actor-initializers.md#stored-property-isolation
Tuve el mismo problema y lo he solucionado de esta manera:
@MainActor class MultipleDownloadsViewModel: NSObject, ObservableObject { @Published var downloads: [DownloadModel] // Init of properties in actor: see https://stackoverflow.com/questions/71396296/how-do-i-fix-expression-requiring-global-actor-mainactor-cannot-appear-in-def/71412877#71412877 @MainActor override init() { downloads = [ DownloadModel(fileToDownload: "https://speed.hetzner.de/100MB.bin"), DownloadModel(fileToDownload: "https://speed.hetzner.de/1GB.bin"), DownloadModel(fileToDownload: "https://speed.hetzner.de/10GB.bin") ] } ... }