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

6

MY DESIGN

我正在制作一个健身应用程序来学习Core data,我发现需要让用户将每次完成的锻炼存储为WorkoutLog项目,在其中,应该有一系列的ExerciseLogs,表示该锻炼的表现(它包含每个举重动作以及对实际锻炼设计的引用)。
问题是,过了一段时间后,我意识到需要按顺序排列这些内容,这样下次想要向用户展示他们的锻炼时,锻炼的顺序应该是相同的。
所以我在那里的右上角勾选了“ordered”,现在我的代码急需更新。我尝试尽可能多地阅读有关使用NSOrderedSet以及如何从Core data中获取并操作它们的内容,但我没有找到对我有用的信息。(我没有Objective-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: 将 'NSOrderedSet?' 强制转换为不相关的类型 'Set' 总是失败。
因此,我对集合和核心数据的理解似乎已经不适用了。
我远非编程专家,但我非常渴望学习如何访问 loggedExercises 实例。
简而言之,有没有一种方法可以将 NSOrderedSet 转换为我可以使用的东西?我们通常如何处理来自核心数据的 NSManagedSets?我们将它们转换为数组或可变集合吗?我非常希望能够得到一个或两个示例,以了解如何开始检索和使用这些有序集合!
谢谢

用户是否可以任意排序练习,还是根据日期设定了一个固定的顺序? - Jon Rose
@JonRose 我希望用户能够任意排列练习。我可能可以给他们一个索引,但我认为使用有序集合会更合适! - Lord Fresh
1个回答

5

如果有其他人想知道如何开始使用Core Data中的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

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接