В настоящее время я изучаю SwiftUI, чтобы включить его в свой ежедневный рабочий процесс на основе UIKit. Я дошел до того, что я не могу запустить концепцию в SwiftUI, которую я годами использовал в UIKit.
Идея состоит в том, чтобы использовать дочерний контекст моего основного CoreData managedObjectContext
для редактирования юридические лица. Я реализую его в основном следующим образом:
// Get view context of application
let viewContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
// Create NSManagedObjectContext
let editingContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
// Set the parent of the editing context to the main view context
editingContext.parent = viewContext
Используя отдельный editingContext
, я могу вносить изменения в сущность в нем без изменений, переходящих непосредственно в мой основной контекст. Если пользователь выбирает отмену изменения, я просто сбрасываю editingContext
.
. Для реализации в SwiftUI я решил реализовать editContext как объект среды, создав пользовательский EnvironmentKey
:
struct EditingContextKey: EnvironmentKey {
static let defaultValue: NSManagedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
}
extension EnvironmentValues {
var editingContext: NSManagedObjectContext {
get {
return self[EditingContextKey.self]
}
set {
self[EditingContextKey.self] = newValue
}
}
}
Затем к моему представлению root добавляется editingContext
:
let contentView = ContentView()
.environment(\.managedObjectContext, viewContext)
.environment(\.editingContext, editingContext)
К этому моменту все работает нормально. Я также могу использовать editingContext
, вызвав следующее в соответствующем представлении.
@Environment(\.editingContext) var editingContext
Однако, как только я внесу изменения в сущность в editingContext
и попытаюсь сохранить editingContext
, Я получаю неожиданную ошибку:
Fatal error: Unresolved error Error Domain=Foundation._GenericObjCError Code=0 "(null)", [:]: file
Я уже проверил, соответствует ли контекст отредактированной сущности editingContext
. Кажется, это так. У меня такое ощущение, что это может быть связано с привязкой в SwiftUI, но я не знаю, как приблизиться к поиску решения.
У кого-нибудь была подобная проблема? Или мой базовый c подход к желаемой функциональности неправильный, и есть более удобный способ сделать это?
Спасибо!