我有一个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)
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>.
| 归档时间: |
|
| 查看次数: |
378 次 |
| 最近记录: |