#swift #core-data
Вопрос:
Мое приложение выходит из строя с ошибкой unrecognized selector sent to instance
и просто выделяется @main
в файле swift моего приложения, что не дает мне никаких подсказок относительно того, что может быть причиной ошибки.
Я думаю, что это может быть связано с конфликтующими данными в @fetchRequest. Я выделил ошибку в этих фрагментах кода:
struct SidebarView: View {
@Environment(.managedObjectContext) private var viewContext
@FetchRequest(entity: Label.entity(), sortDescriptors: [NSSortDescriptor(keyPath: Label.name, ascending: true)])
var labels: FetchedResults<Label>
var body: some View {
let allLabelNames = labels.map { "($0.value(forKeyPath: "name")!)" }
let labelNames = allLabelNames.uniqued()
VStack{
NavigationLink(destination: AllDataView(names: labelNames)){
Text("View all data")
}
}
}
struct AllDataView: View {
var imagesFetchRequest: FetchRequest<Sample>
var images: FetchedResults<Sample>{
imagesFetchRequest.wrappedValue
}
private var names: [String]
init(names: [String]){
let samplesSortDescriptor = NSSortDescriptor(keyPath: Sample.label, ascending: true)
let predicate = NSPredicate(format: "label.name IN %@", names)
self.names = names
imagesFetchRequest = FetchRequest<Sample>(entity: Sample.entity(), sortDescriptors: [samplesSortDescriptor], predicate: predicate)
}
}
Обратите внимание, что метка представляет собой NSManagedObject
Есть какие-нибудь идеи о том, как отладить эту проблему, чтобы найти точную строку в моем приложении, которая вызывает сбой?
Комментарии:
1. Выдайте полное сообщение об ошибке.
2.
NSSortDescriptor(keyPath: Sample.label, ascending: true)
=>NSSortDescriptor(keyPath: Sample.label.name, ascending: true)
? Вы пытаетесь отсортировать поlabel
свойству, которое является aLabel
. Таким образом, в какой-то момент он будет сравниватьLabel
экземпляр с другим , вызываяcompare()
, что в вашем случае не работает… Вы хотите сравнить по свойству name.3. Спасибо @Larne! в этом-то и была проблема. если вы добавите это в качестве ответа, я отмечу его как правильный.
Ответ №1:
NSSortDescriptor(keyPath: Sample.label, ascending: true)
=>
NSSortDescriptor(keyPath: Sample.label.name, ascending: true)
В первом случае вы пытаетесь выполнить сортировку Sample
по свойству label
( Label
).
Так что в какой-то момент будет [someLabelInstance compare:someOtherLabelInstance]
полезно узнать, какой из них нужно поставить перед другим. Но у Label
него нет метода экземпляра compare()
, поэтому вы получаете ошибку.
Вы хотите на самом деле отсортировать по name
свойству этого label
. Свойство, которое является String
(неявным при чтении вашего кода) и является «сортируемым» (реализует compare()
).