SwiftUI @FetchRequest вызывает сбой приложения и возвращает ошибку

Я пытаюсь использовать основные данные в своем приложении для Mac с помощью SwiftUI, используя Xcode 11. Я установил флажок "Использование основных данных" при создании проекта. Я также создал объект (называемый VisitedCases) и использовал редактор для создания файлов подкласса NSManagedObject. Я также установил Codegen на Manual/none. Вот код в сгенерированных файлах NSManagedObject:

VisitedCases + CoreDataProperties.swift

extension VisitedCases {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<VisitedCases> {
        return NSFetchRequest<VisitedCases>(entityName: "VisitedCases")
    }

    @NSManaged public var caseNumber: String

} 

VisitedCases+CoreDataClass.swift

@objc(VisitedCases)
public class VisitedCases: NSManagedObject {

}

Я назвал @Environment переменной и @FetchRequest в ContentView.swift как:

struct ContentView: View {
    @Environment(\.managedObjectContext) var managedObjectContext

    @FetchRequest(entity: VisitedCases.entity(),
                  sortDescriptors: []
                  ) var orders: FetchedResults<VisitedCases>
//@State vars and the rest of the code
}

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

2020-02-23 18:36:16.889306+0330 ImageSelector[17874:149503] [error] error: No NSEntityDescriptions in any model claim the NSManagedObject subclass 'VisitedCases' so +entity is confused.  Have you loaded your NSManagedObjectModel yet ?
CoreData: error: No NSEntityDescriptions in any model claim the NSManagedObject subclass 'VisitedCases' so +entity is confused.  Have you loaded your NSManagedObjectModel yet ?
2020-02-23 18:36:16.889389+0330 ImageSelector[17874:149503] [error] error: +[VisitedCases entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass
CoreData: error: +[VisitedCases entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass
2020-02-23 18:36:16.921131+0330 ImageSelector[17874:149503] executeFetchRequest:error: A fetch request must have an entity.

У меня также есть функция, которая сохраняет строку в хранилище и, похоже, работает нормально:

    func addCaseNumber (caseNo: String) {
        guard caseNo != "" else {return}
        let newCaseNumber = VisitedCases(context: self.managedObjectContext)
        newCaseNumber.caseNumber = caseNo
        do {
         try self.managedObjectContext.save()
         print("Case number saved.")
        } catch {
         print(error.localizedDescription)
         }
    }

Что не так с моим кодом и что мне делать, чтобы это исправить?

3 ответа

Решение

В @enviromentVAr иногда вам нужно самостоятельно установить среду.

 let managedObjectContext: NSManagedObjectContext =  ((UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext)!

 ContentView().environment(\.managedObjectContext, managedObjectContext)

Тогда может работать managedObjectContext.

 @Environment(\.managedObjectContext) var managedObjectContext

Попробуйте назначить свой managedObjectContext в твоем ContentView как это

let managedObjectContext: NSManagedObjectContext =  ((UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext)!

Если это работает, значит, ваш @Environment var не работает.

Чтобы узнать, где происходит разрыв, начните с SceneDelegate имея

let contentView = ContentView().environment(\.managedObjectContext, context)

Тогда посмотрите, где связь с Environment ломается

Поместите что-то подобное во все ваши представления, чтобы увидеть, что не Environment переменная.

@Environment(\.managedObjectContext) var managedObjectContext
     var body: some View {
         print("MOC = ")
         print(managedObjectContext.name ?? "broken")
     return Text("Hello World!")
}

Когда вы найдете перерыв, восстановите его с помощью

YourBrokenView().environment(\.managedObjectContext, managedObjectContext)

Это то, что сработало для меня. Я использовал подклассы NSManagedObject (Manual/None в определении кодогенератора) для моего объекта CoreData, потому что я делал некоторую разворачивание. Мне нужно удалить класс и использовать редактор для повторной генерации, после чего все снова заработало

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