es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilizando Resolver para registrar un Modelo de Vista con la anotación “”@Main Actor””

Mi modelo de vista tiene varias funciones que utilizan Task para ejecutar casos de uso. Utilizo la anotación “@Main Actor” para publicar actualizaciones de UI en el hilo principal. Me aparece un error al intentar registrar el modelo de vista en Resolver.

¿Hay alguna forma de registrar este tipo de modelos de vista en Resolver?

Error:

Llamada al constructor aislado por actor principal ‘init()’ en un contexto síncrono no aislado

Registrando:

extension Resolver: ResolverRegistering {
    public static func registerAllServices() {
        register {
            MeetingListViewModel() as MeetingListViewModel
        }
        .scope(.graph)
    }
}

ViewModel:

@MainActor
class MeetingListViewModel: ObservableObject {
   ...
}

View:

struct MeetingListView: View {
    @StateObject var viewModel: MeetingListViewModel = Resolver.resolve()
    ...
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de registrar este tipo de modelos de vista en Resolver. Puedes usar la anotación @MainActor en el método init de tu modelo de vista, de la siguiente manera:

    @MainActor
    class MeetingListViewModel: ObservableObject {
        @Published var meetings: [Meeting] = []
    
        init() {}
    
        func loadMeetings() async {
            self.meetings = await fetchMeetings()
        }
    
        private func fetchMeetings() async -> [Meeting] {
            // fetch meetings here
            return []
        }
    }
    

    Luego, puedes registrar tu modelo de vista en Resolver de la siguiente manera:

    extension Resolver: ResolverRegistering {
        public static func registerAllServices() {
            register { MeetingListViewModel() }
                .scope(.graph)
        }
    }
    

    Después de registrar tu modelo de vista, puedes resolverlo en tu vista utilizando Resolver.resolve():

    struct MeetingListView: View {
        @StateObject var viewModel: MeetingListViewModel = Resolver.resolve()
        ...
    }
    

    Ten en cuenta que no necesitas hacer un casting de tu modelo de vista a MeetingListViewModel en el bloque de registro, ya que Resolver inferirá automáticamente el tipo.

Comments are closed.