#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 !!
итак, как только свойство изменится, представление будет перестроено, поскольку свойство соблюдается, и будет введен новый контекст.