从Core Data检索NSOrderedSet并将其转换为实体managedObjectSubclasss

时间:2017-08-16 14:36:28

标签: swift core-data nsorderedset

MY DESIGN

我正在制作一个健身应用程序来学习核心数据,我发现我需要让用户将每个执行的锻炼存储为一个WorkoutLog项目,并且在那里,应该有一系列的练习日表示该练习的表现(它包含每个升降机,也参考实际的运动设计)。

问题是,经过一段时间后我意识到我需要对这些进行排序,以便下次我想向用户展示他们的锻炼时,锻炼的顺序应该是相同的。

所以我检查了#34;命令"在那里的图像的右上角,现在我的代码急需更新。我试图尽可能多地阅读使用NSOrderedSet以及如何从核心数据中获取它们然后操纵它们,但我并没有真正对我有用。 (我没有客观的经验-c)

例如我以前的代码是:

static func deleteWorkoutLog(_ workoutLogToDelete: WorkoutLog) {

    guard let exerciseLogsToDelete = workoutLogToDelete.loggedExercises as? Set<ExerciseLog> else {
        print("error unwrapping logged exercises in deleteWorkoutLog")
        return
    }

我收到错误:... / DatabaseFacade.swift:84:77:来自&#39; NSOrderedSet?&#39;不相关的类型&#39; Set&#39;总是失败

因此,我对集合和核心数据的了解似乎不再适用。

我远非编程方面的专家,但我非常渴望学习如何访问loggedExercises实例。

TLDR;有没有办法将NSOrderedSet转换为我可以使用的东西?我们如何通常使用核心数据中的NSManagedSets?我们将它们转换为Arrays或MutableSets吗?我非常感谢如何开始检索和使用这些有序集合的一两个例子!

由于

1 个答案:

答案 0 :(得分:1)

对于其他任何想知道如何开始核心数据中的orderedSets的人:

在设置了我的WorkoutLog.loggedExercises“to-many”关系后,我设法通过mutableOrderedSetValue函数访问它们,如下所示:

static func deleteWorkoutLog(_ workoutLogToDelete: WorkoutLog) {

  let orderedExerciseLogs: NSMutableOrderedSet = workoutLogToDelete.mutableOrderedSetValue(forKey: "loggedExercises")

  let exerciseLogsToDelete = orderedExerciseLogs.array

  for exerciseLog in exerciseLogsToDelete {

    guard let exerciseLog = exerciseLog as? ExerciseLog else {
      return
    }

到目前为止效果很好。

为了重新排列NSOrderedSet,我最终做了这样的事情:

    // Swap the order of the orderedSet
    if let orderedExerciseLogs: NSOrderedSet = dataSourceWorkoutLog.loggedExercises {

        var exerciseLogsAsArray = orderedExerciseLogs.array as! [ExerciseLog]

        let temp = exerciseLogsAsArray[indexA]
        exerciseLogsAsArray[indexA] = exerciseLogsAsArray[indexB]
        exerciseLogsAsArray[indexB] = temp

        let exerciseLogsAsOrderedeSet = NSOrderedSet(array: exerciseLogsAsArray)
        dataSourceWorkoutLog.loggedExercises = exerciseLogsAsOrderedeSet

    }