首先我想指出的是,有很多問題報告類似的錯誤,但我的情況是不同的。核心數據:發送到實例的無法識別的選擇器
我有這三個核心數據實體:
- 培訓,擁有的FeatureSet對象的集合
- 的FeatureSet,有FeatureGroup對象的集合
- FeatureGroup,只具有數字字段
每個實體都有其相反的關係(例如,FeatureSet與Training具有逆多對一的關係)。
一個輔助類的三種方法執行對象插入到被管理對象上下文:
// MARK: - Insertion
func insertFeatureGroup(_ groupDict:[String:Any], inSet set:FeatureSet, forData data:String) -> FeatureGroup? {
guard let group = NSEntityDescription.insertNewObject(forEntityName: "FeatureGroup", into: self.context) as? FeatureGroup else { return nil }
group.data = data
group.set = set
if let min = groupDict["min"] as? Double { group.min = min as NSNumber }
if let max = groupDict["max"] as? Double { group.max = max as NSNumber }
if let mean = groupDict["mean"] as? Double { group.mean = mean as NSNumber }
if let median = groupDict["median"] as? Double { group.median = median as NSNumber }
if let deviation = groupDict["deviation"] as? Double { group.deviation = deviation as NSNumber }
if let skewness = groupDict["skewness"] as? Double { group.skewness = skewness as NSNumber }
if let kurtosis = groupDict["kurtosis"] as? Double { group.kurtosis = kurtosis as NSNumber }
return group
}
func insertFeatureSet(_ featuresDict:[String:Any], inTraining training:Training) -> FeatureSet? {
guard let set = NSEntityDescription.insertNewObject(forEntityName: "FeatureSet", into: self.context) as? FeatureSet else { return nil }
guard let sequenceNumber = featuresDict["sequenceNumber"] as? Int16 else { return nil }
training.addToSets(set)
set.training = training
set.sequenceNumber = sequenceNumber
if let heartRate = featuresDict["heartRate"] as? [String:Any] {
if let group = insertFeatureGroup(heartRate, inSet: set, forData: "heartRate") {
set.addToGroups(group)
}
}
if let rotationRate = featuresDict["rotationRate"] as? [String:Any] {
if let group = insertFeatureGroup(rotationRate, inSet: set, forData: "rotationRate") {
set.addToGroups(group)
}
}
if let userAcceleration = featuresDict["userAcceleration"] as? [String:Any] {
if let group = insertFeatureGroup(userAcceleration, inSet: set, forData: "userAcceleration") {
set.addToGroups(group)
}
}
if let altitude = featuresDict["altitude"] as? [String:Any] {
if let group = insertFeatureGroup(altitude, inSet: set, forData: "altitude") {
set.addToGroups(group)
}
}
if let course = featuresDict["course"] as? [String:Any] {
if let group = insertFeatureGroup(course, inSet: set, forData: "course") {
set.addToGroups(group)
}
}
if let speed = featuresDict["speed"] as? [String:Any] {
if let group = insertFeatureGroup(speed, inSet: set, forData: "speed") {
set.addToGroups(group)
}
}
return set
}
func insertTraining(activity:String) -> Training? {
guard let training = NSEntityDescription.insertNewObject(forEntityName: "Training", into: self.context) as? Training else { return nil }
training.activity = activity
return training
}
這就是我如何執行讀取:
// MARK: - Fetch
var trainings:[Training]? {
let request = NSFetchRequest<NSFetchRequestResult>()
request.returnsObjectsAsFaults = false
let entity = NSEntityDescription.entity(forEntityName: "Training", in: self.context)
request.entity = entity
let sortDesc = NSSortDescriptor(key: "startTime", ascending: true)
request.sortDescriptors = [sortDesc]
do {
guard let trainings = try self.context.fetch(request) as? [Training] else {
return nil
}
return trainings
} catch {
print("Error Fetching Trainings: \(error)")
return nil
}
}
當我嘗試訪問featureSet對象的groups屬性時,問題就出現了。讓我們支持,在我的代碼中的一些部分我獲取所有培訓(以及他們已成功獲取):
guard let trainings = <myUtilityClassInstance>.trainings else { return }
guard let myTraining = trainings.first else { return }
guard let mySet = myTraining.sets.first as? FeatureSet else { return }
print(mySet.groups)
的最後一行代碼生成了異常:「無法識別的選擇發送到實例0x1700994b0」。如果我嘗試檢查對象mySet的類別,我可以看到它實際上是一個FeatureSet對象。這個類有一個「groups」屬性。但是,似乎組的屬性不被識別,訪問它會產生一個異常。 我的Xcode項目很大,我意識到問題可能出現在代碼的其他部分。我正在尋找關於如何調查此例外的建議。我使用由Core Data自動生成的類(Training,FeatureSet,FeatureGroup),其中包括屬性的某些訪問器(例如在FeatureSet中添加/刪除組的方法)。
更新:所述的FeatureSet類定義是空的,但這些都是被自動CoreData產生的擴展:
extension FeatureSet {
@nonobjc public class func fetchRequest() -> NSFetchRequest<FeatureSet> {
return NSFetchRequest<FeatureSet>(entityName: "FeatureSet")
}
@NSManaged public var sequenceNumber: Int16
@NSManaged public var groups: NSSet?
@NSManaged public var training: Training?
}
// MARK: Generated accessors for groups
extension FeatureSet {
@objc(addGroupsObject:)
@NSManaged public func addToGroups(_ value: FeatureGroup)
@objc(removeGroupsObject:)
@NSManaged public func removeFromGroups(_ value: FeatureGroup)
@objc(addGroups:)
@NSManaged public func addToGroups(_ values: NSSet)
@objc(removeGroups:)
@NSManaged public func removeFromGroups(_ values: NSSet)
}
您可以顯示一些FeatureSet類,特別是在定義了組的地方嗎? – clarus
@clarus我添加了代碼。 –
錯誤通常會說哪個類和哪個選擇器導致問題。你有嗎? (我知道你假設'FeatureSet.groups',但是它實際上報告了什麼?) –