Ошибка CoreData: Не удалось создать объект класса Objective-C с именем “Array”

Вопрос или проблема

С тех пор как я обновился до Xcode 16, при компиляции я вижу, как мои логи заполняются следующими уведомлениями, предупреждениями и ошибками:

CoreData: fault: Не удалось материализовать класс Objective-C с именем "Array" из объявленного типа значения атрибута "Array<String>" атрибута с именем categories

fault: Не удалось материализовать класс Objective-C с именем "Array" из объявленного типа значения атрибута "Array<String>" атрибута с именем categories

CoreData: Не удалось материализовать класс Objective-C с именем "Array" из объявленного типа значения атрибута "Array<String>" атрибута с именем categories

Первая строка отображается белым цветом, вторая – желтым, третья – красным.
Я вижу это как для Array<String>, так и для Array<UUID>, и каждая переменная, о которой сообщается, вызывает все три этих сообщения.

Но у меня есть несколько моделей SwiftData с типами Array и Array, и только некоторые из них вызывают это в логах. Возможно, это просто спам в логах, который можно игнорировать, но моё приложение очень медленное и часто вылетает на iOS18 (всё ещё отлично на iOS17!), так что я не могу это исключить пока.

Вот также полное неинтересное определение модели (к счастью, у меня только одна модель, которая имеет параметр categories).

@Model
class CategoryGroupDetailsSD {
    @Attribute(.unique) var id: String
    var name: String
    var categories: [String]
    var icon: String?
    var updatedAt: Date?

    init(id: String, name: String, categories: [String], icon: String?, updatedAt: Date?) {
        self.id = id
        self.name = name
        self.categories = categories
        self.icon = icon
        self.updatedAt = updatedAt
    }

    convenience init(item: CategoryGroupDetailsDTO) {
        self.init(
            id: item.id,
            name: item.name,
            categories: item.categories,
            icon: item.icon,
            updatedAt: item.updatedAt
        )
    }
}

extension CategoryGroupDetailsSD {
    func updateProperties(from other: CategoryGroupDetailsDTO) {
        self.name = other.name
        self.categories = other.categories
        self.icon = other.icon
        self.updatedAt = other.updatedAt
    }
}

Кто-нибудь знает больше об этих ошибках? Как я могу диагностировать или решить проблему?

Ответ или решение

Проблема, с которой вы столкнулись, связана с совместимостью Core Data и Swift Data в версии Xcode 16. В частности, ошибки о том, что не удалось материализовать класс Objective-C с именем "Array", указывают на то, что Core Data не может корректно интерпретировать тип данных массивов в вашем определении модели.

Шаги для диагностики и решения проблемы

  1. Проверка конфигурации модели данных:
    Убедитесь, что ваша модель данных в Xcode настроена правильно, и атрибут categories действительно имеет тип, совместимый с Core Data. Для массивов используйте атрибут типа Transformable, так как массивы не поддерживаются нативно в Core Data.

    Пример:

    var categories: [String] {
       get {
           return (categoriesData as? [String]) ?? []
       }
       set {
           categoriesData = newValue as NSArray
       }
    }
    @Attribute(.transformable) var categoriesData: NSArray?
  2. Обновление типов данных:
    Если вы хотите использовать массивы в Core Data, возможно, стоит рассмотреть возможность использования NSSet вместо массивов, так как они более эффективно обрабатываются Core Data. Это можно сделать следующим образом:

    @NSManaged var categories: NSSet?
    
    var categoriesArray: [String] {
       get { categories?.allObjects as? [String] ?? [] }
       set { categories = NSSet(array: newValue) }
    }
  3. Использование Swift Types в Core Data:
    Несмотря на то, что вы используете массивы Swift, Core Data основано на Objective-C и может не поддерживать их должным образом. Убедитесь, что в атрибутах, где вы ожидаете увидеть массивы, указаны правильные типы.

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

  5. Логирование и отладка:
    Добавьте больше логов в ваше приложение, чтобы лучше понять, когда и где возникает проблема. Используйте инструменты, такие как Instruments, для мониторинга производительности приложения и выяснения, что может вызывать задержки и сбои.

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

  7. Создание запросов для диагностики:
    Выполните запросы на выборку, чтобы проверить, могут ли они успешно вернуть данные для атрибутов, которые вызывают проблемы. Ошибки во времени выполнения могут указать на то, что объект не может быть десериализован из-за состояния баз данных или несовместимости типов.

Заключение

Если после выполнения всех шагов проблема не решена, рассмотрите возможность создания нового вопроса на форум обсуждения разработчиков Apple и предоставьте подробности о вашем проекте, включая модели и конфигурации, чтобы получить помощь от сообщества или команды поддержки. Надеюсь, эти шаги помогут вам решить вашу проблему с Core Data и производительностью приложения.

Оцените материал
Добавить комментарий

Капча загружается...