우선, 비슷한 오류를보고하는 많은 질문이 있지만, 내 경우는 다른 사례라는 것을 지적하고 싶습니다.핵심 데이터 : 인스턴스로 전송 된 인식 할 수없는 선택자
나는이 세 가지 핵심 데이터 개체가 있습니다 만 숫자 필드을 가지고 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 객체의 그룹 속성에 액세스하려고하면 문제가 발생합니다. 이제 나는 모든 교육을 인출 내 코드의 일부에 해당 의한 지원 (그들은 성공적으로 인출된다) :
는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 객체라는 것을 알 수 있습니다. 이 클래스에는 "그룹"속성이 있습니다. 그러나 그룹 속성이 인식되지 않고 액세스하는 경우 예외가 발생하는 것처럼 보입니다. 내 Xcode 프로젝트가 크고 문제가 코드의 다른 부분에있을 수 있음을 알고 있습니다. 이 예외를 조사하는 방법에 대한 제안을 찾고 있습니다.
PS : 핵심 데이터에 의해 자동 생성되는 클래스 (예 : FeatureSet의 그룹 추가/제거 방법)에 대한 몇 가지 접근자를 포함하는 클래스 (Training, FeatureSet, FeatureGroup)를 사용하고 있습니다.
업데이트 다음 된 형상 클래스 정의가 비어 있지만 이러한 자동 CoreData에 의해 생성 된 확장이다 : 그것은 NSManagedObjectContext 객체가 데이터를 가져 오기 위해 사용되는 것으로 밝혀졌다
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'을 추측하고 있다는 것을 알고 있지만 그것이 실제로보고하는 것입니까?) –