替换的 List<T> 对象在 Realm 中未保持一致

bri*_*ncl 1 realm swift

我有一个List<Workout>偶尔需要排序的对象(例如,如果用户添加了一个无序的锻炼),但我似乎无法让新的排序List<Workout>​​保持不变。我的代码在运行时就可以工作(即,它按排序显示在视图上),但是当我退出 ViewController 或重新启动应用程序时,我什么也看不到。没有什么是由于exercise.workoutDiary.removeAll()持久性造成的,但显然随后对 的分配exercise.workoutDiary = sortedWorkoutDiary没有持久性。有什么想法吗?

其他一切都很好。典型recordWorkout()情况是假设没有任何乱序输入的情况。因此,除了覆盖排序列表之外,几乎所有情况下持久化都有效。

更新发生在这里:

struct ExerciseDetailViewModel {

    private let exercise: Exercise!

    func recordWorkout(newWorkout: Workout) {
        let lastWorkout = exercise.workoutDiary.last // grab the last workout for later comparison

        let realm = try! Realm()
        try! realm.write {
            exercise.workoutDiary.append(newWorkout) // write the workout no matter what
        }

        if let secondToLastWorkout = lastWorkout { // only bother checking out of order if there is a last workout...
            if newWorkout.date < secondToLastWorkout.date { // ...and now look to see if they are out of order
                let sortedWorkoutDiary = exercise.sortedWorkouts
                try! realm.write {
                    exercise.workoutDiary.removeAll()
                    exercise.workoutDiary = sortedWorkoutDiary
                }
            }
        }
    }
}

final class Exercise: Object {

    var workoutDiary = List<Workout>()
    var sortedWorkouts: List<Workout> {
        return List(workoutDiary.sorted("date"))
    }
}

final class Workout: Object {

    dynamic var date = NSDate()
    var sets = List<WorkSet>()
}
Run Code Online (Sandbox Code Playgroud)

bda*_*ash 5

List<T>Realm Swift 中的属性必须就地改变,而不是分配。Swift 运行时不为 Realm 提供任何拦截泛型类型属性赋值的方法。相反,您应该使用类似的方法appendContentsOf(_:)来改变List<T>

exercise.workoutDiary.removeAll()
exercise.workoutDiary.appendContentsOf(sortedWorkoutDiary)
Run Code Online (Sandbox Code Playgroud)

对泛型类型属性赋值的这种限制是 Realm Swift 文档建议您使用let而不是var声明此类属性的原因。这将使 Swift 编译器能够捕获此类错误。

进一步注意:对于您的sortedWorkouts计算属性,最好让它返回Results<Workout>,以避免分配和填充中间List<Workout>.