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, потому что я делал некоторую разворачивание. Мне нужно удалить класс и использовать редактор для повторной генерации, после чего все снова заработало