Сбой свойства деформации NSPersistentDocument FetchRequest в проекте SwiftUI приложения MacOS Document App
- Создание проекта с использованием
Xcode macOS Document App
шаблон, сUse Core Data
флажок установлен. - Добавить сущность книги в
Document.xcdatamodeld
- Добавить свойство деформации FetchRequest в
ContentView
,
@FetchRequest(entity: Book.entity(), sortDescriptors: []) var books: FetchedResults<Book>
- Строй и беги, сбой!
Журнал сбоев с консоли
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 несколько дней, но не смог его найти. Вот несколько похожих или взаимосвязанных вопросов. К сожалению, эта проблема не решена.
- При использовании @fetchRequest(entity:) для приложения SwiftUI macOS происходит сбой
- SwiftUI @FetchRequest вызывает сбой приложения и возвращает ошибку
- https://developer.apple.com/forums/thread/124656?answerId=417869022
- https://developer.apple.com/forums/thread/132624
РЕДАКТИРОВАТЬ: загрузите этот проблемный проект в 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.