Сбой при использовании общего экземпляра контроллера данных в определении объекта приложения.

Я получаю необычноесбой при попытке доступа к общему объекту контроллера данных из ярлыков приложенияопределение. Кажется, это относится к.

Контроллер данных объявлен в моем основном приложении и передается через среду:

      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
    }
}

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

Проблема в том, чтометод вызывает сбой, когда он, в свою очередь, вызывает.


За кулисами,Метод выполняет выборку основных данных для возврата элементов. Кажется, что сбой происходит (периодически) при удалении или добавлении элементов, а иногда и при запуске приложения (похоже, что iOS создает экземпляры объектов приложения при запуске, поэтому вызывается этот код). Интересно, что использование самого ярлыка приложения работает нормально!

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

Интересно, не готов ли стек Core Data в общем экземпляре при запуске кода App Entity? Любой совет будет принят во внимание.


Одно из решений, которое я рассматриваю, — сохранить упрощенное представление данных из Core Data в формате JSON и просмотреть его, чтобы получить элементы для устранения неоднозначности. Это то, что я делаю для виджетов, находящихся в расширении. Раньше я использовал расширение намерения, но это ярлыки приложений iOS16, которые (AFAIK) запускаются в основном процессе приложения.


Редактировать

Мне удалось обойти эту проблему, избегая вызова основных данных и вместо этого используя данные в формате JSON в контейнере группы приложений, который я уже использую для виджетов. Однако это не объясняет проблему здесь.

0 ответов

Другие вопросы по тегам