Как реализовать дочерний контекст (CoreData) в среде SwiftUI? - PullRequest
1 голос
/ 01 апреля 2020

В настоящее время я изучаю 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 подход к желаемой функциональности неправильный, и есть более удобный способ сделать это?

Спасибо!

1 Ответ

0 голосов
/ 07 апреля 2020

Я не пробовал сам, но я бы предположил, что вы установите значение окружения \.managedObjectContext в качестве дочернего контекста вместо основного контекста.

Затем, когда вам нужно сохранить, вы можете сначала сохраните этот контекст, затем вызовите save для родительского свойства. Хотя вы, возможно, захотите взглянуть на настройки SwiftUI, которые являются способом отправки уведомлений вверх по иерархии в случае, если вы хотите сохранить родителя вне / или выше, где вы сохраняете дочерний элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...