2017-09-21 54 views
0

首先我想指出的是,有很多問題報告類似的錯誤,但我的情況是不同的。核心數據:發送到實例的無法識別的選擇器

我有這三個核心數據實體:

  1. 培訓,擁有的FeatureSet對象的集合
  2. 的FeatureSet,有FeatureGroup對象的集合
  3. FeatureGroup,只具有數字字段

每個實體都有其相反的關係(例如,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對象的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) 

} 
+0

您可以顯示一些FeatureSet類,特別是在定義了組的地方嗎? – clarus

+0

@clarus我添加了代碼。 –

+0

錯誤通常會說哪個類和哪個選擇器導致問題。你有嗎? (我知道你假設'FeatureSet.groups',但是它實際上報告了什麼?) –

回答

2

原來,用於獲取數據的的NSManagedObjectContext對象當我試圖訪問FeatureSet屬性時被釋放。有關此事的更多信息可以在here找到。

相關問題