Сбой свойства деформации NSPersistentDocument FetchRequest в проекте SwiftUI приложения MacOS Document App

  1. Создание проекта с использованием Xcode macOS Document App шаблон, с Use Core Data флажок установлен.
  2. Добавить сущность книги в Document.xcdatamodeld
  3. Добавить свойство деформации FetchRequest в ContentView,
@FetchRequest(entity: Book.entity(), sortDescriptors: []) var books: FetchedResults<Book>
  1. Строй и беги, сбой!

Журнал сбоев с консоли

2020-07-03 23:12:23.597880+0800 DocMacDemo[15236:4376209] [error] error: No NSEntityDescriptions in any model claim the NSManagedObject subclass 'DocMacDemo.Book' so +entity is confused.  Have you loaded your NSManagedObjectModel yet ?
CoreData: error: No NSEntityDescriptions in any model claim the NSManagedObject subclass 'DocMacDemo.Book' so +entity is confused.  Have you loaded your NSManagedObjectModel yet ?
2020-07-03 23:12:23.598287+0800 DocMacDemo[15236:4376209] [error] error: +[DocMacDemo.Book entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass
CoreData: error: +[DocMacDemo.Book entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass
2020-07-03 23:12:23.644491+0800 DocMacDemo[15236:4376209] executeFetchRequest:error: A fetch request must have an entity.
2020-07-03 23:12:23.653769+0800 DocMacDemo[15236:4376209] [error] error: The fetch request's entity 0x600003500420 'Book' appears to be from a different NSManagedObjectModel than this context's
CoreData: error: The fetch request's entity 0x600003500420 'Book' appears to be from a different NSManagedObjectModel than this context's
(lldb)

Я искал пример NSPersistentDocument SwiftUI несколько дней, но не смог его найти. Вот несколько похожих или взаимосвязанных вопросов. К сожалению, эта проблема не решена.

РЕДАКТИРОВАТЬ: загрузите этот проблемный проект в Github, https://github.com/donly/DocMacDemo.

2 ответа

Решение

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

Вот возможное решение. Протестировано с Xcode 11.4 / iOS 13.4

в Document.swift

class Document: NSPersistentDocument {

    // .. other code here

    override func makeWindowControllers() {

        // in case of new document create new empty book in context
        // that will be shown in opened document window
        let isNew = self.fileURL == nil
        if isNew {
            _ = Book(context: self.managedObjectContext!)       // << here !!
        }

        let contentView = ContentView().environment(\.managedObjectContext, self.managedObjectContext!)

        // ... other code here

Что ж, ответ Asperi в порядке, но это оставляет вам, возможно, ненужную книгу в объектной модели. Другой способ — просто сохранить контекст в том же месте, как предложил Asperi:

          if let context = managedObjectContext {
        try? context.save()
    }

Тогда также не будет сообщения об ошибке от FetchRequest.

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