Сбой при использовании общего экземпляра контроллера данных в определении объекта приложения.
Я получаю необычное
Контроллер данных объявлен в моем основном приложении и передается через среду:
struct myApp: App {
@StateObject var dataController: DataController
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(dataController)
}
}
init() {
_dataController = StateObject(wrappedValue: DataController.shared)
}
В моей сущности приложения и виджетах доступ к нему осуществляется как к общему экземпляру. Например, вот сокращенная версия сущности приложения и запроса.
struct MyAppEntity: AppEntity {
@Property(title: "Name")
var name: String?
// ... some code omitted
struct MyAppEntityQuery: EntityQuery {
// Option 1: Having data controller here flags a warning about it
// not being a Sendable type
let dataController = DataController.shared
func entities(for identifiers: [MyAppEntity.ID]) async throws -> [MyAppEntity] {
// Option 2: Having data controller here in the function is
// transient, so no Sendable warning as above
let dataController = DataController.shared
let items = dataController.getAllItems()
// ... use items to provide list for disambiguation
}
// ... some code omitted
}
}
Обратите внимание на два варианта расположения контроллера данных. Оба вызывают сбои, и использование его в качестве свойства верхнего уровня вызывает предупреждение о том, что это не так.
Проблема в том, что
За кулисами,
Я пробовал с SwiftUI
Интересно, не готов ли стек Core Data в общем экземпляре при запуске кода App Entity? Любой совет будет принят во внимание.
Одно из решений, которое я рассматриваю, — сохранить упрощенное представление данных из Core Data в формате JSON и просмотреть его, чтобы получить элементы для устранения неоднозначности. Это то, что я делаю для виджетов, находящихся в расширении. Раньше я использовал расширение намерения, но это ярлыки приложений iOS16, которые (AFAIK) запускаются в основном процессе приложения.
Редактировать
Мне удалось обойти эту проблему, избегая вызова основных данных и вместо этого используя данные в формате JSON в контейнере группы приложений, который я уже использую для виджетов. Однако это не объясняет проблему здесь.