Как обновить managedObjectContext в среде позже

#swift #core-data #swiftui

#swift #core-данные #swiftui

Вопрос:

У меня есть базовое приложение SwiftUI NSPersistentCloudKitContainer , которое при запуске приложения вводит постоянный стек на основе, вводит viewContext в среду и передает его во все представления моего приложения. Это работает так, как ожидалось. PersistentContainer настроен на синхронизацию с CloudKit по умолчанию. Теперь я хочу предоставить пользователю способ переключения синхронизации iCloud в настройках приложения, я делаю это, устанавливая значение cloudKitContainerOptions nil в StoreDescription и повторно инициализируя постоянный стек.

Проблема в том, что теперь managedObjectContext в среде устарел, и его также необходимо будет повторно ввести. У кого-нибудь есть идеи, как это сделать? У меня есть мои пользовательские настройки ObservableObject в структуре приложения, но я не уверен, как я могу запустить повторное внедрение представления:

 @main
struct MyApp: App {
   [...]

   @ObservedObject private var userSettings: UserSettings
   private let persistenceController: PersistenceController

   var body: some Scene {
        WindowGroup {
            let service1 = Service1(context: persistenceController.container.viewContext)
            let service2 = Service2(context: persistenceController.container.viewContext)

            HomeTabView()
                .environment(.managedObjectContext, persistenceController.container.viewContext)
                .environmentObject(service1)
                .environmentObject(service2)
                    
        }
   }
}
  

Или можно переключить синхронизацию iCloud без повторной инициализации всего NSPersistentCloudKitContainer ?

Ответ №1:

Вы можете выполнить перестройку представления в зависимости от UserSettings упомянутого вами свойства переключения, например

 HomeTabView()
    .environment(.managedObjectContext, persistenceController.container.viewContext)
    .environmentObject(service1)
    .environmentObject(service2)
    .id(userSettings.your_toggle_Sync_Property)    // << here !!
  

итак, как только свойство изменится, представление будет перестроено, поскольку свойство соблюдается, и будет введен новый контекст.