2017-09-21 2 views
0

우선, 비슷한 오류를보고하는 많은 질문이 있지만, 내 경우는 다른 사례라는 것을 지적하고 싶습니다.핵심 데이터 : 인스턴스로 전송 된 인식 할 수없는 선택자

나는이 세 가지 핵심 데이터 개체가 있습니다 만 숫자 필드을 가지고 FeatureGroup의 모음

  • FeatureGroup 객체가 된 형상의 모음
  • 된 형상 객체가

    1. 교육,,,

    모든 엔티티에는 역 관계가 있습니다 (예 : FeatureSet에는 Training과 역 다 관계가 있음).

    enter image description here

    헬퍼 클래스의이 세 가지 방법은 관리 개체 컨텍스트에있는 개체의 삽입을 수행

    // 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) 
    
    } 
    
  • +0

    특히 그룹이 정의 된 곳에서 약간의 FeatureSet 클래스를 표시 할 수 있습니까? – clarus

    +0

    @clarus 코드를 추가했습니다. –

    +0

    오류는 일반적으로 문제를 일으킨 클래스와 셀렉터를 나타냅니다. 그거 있니? (나는 당신이'FeatureSet.groups'을 추측하고 있다는 것을 알고 있지만 그것이 실제로보고하는 것입니까?) –

    답변

    2

    FeatureSet그룹 속성에 액세스하려고 할 때 할당이 해제되었습니다. 이 문제에 대한 자세한 내용은 here을 참조하십시오.