我正在使用SwiftRealm 2.03并且不了解如果领域中的数据发生变化,常量数据(甚至元数据)如何更新的魔力......
这是一个例子:
private func closePastExistingTravelTimes(){
let travelTimes = fetchTravelTimes(onlyNotClosedTravelTimes: true)
guard travelTimes.count > 1 else {
return
}
let numberOfTravelTimes = travelTimes.count
for index in 0..<numberOfTravelTimes-2{
print("index:\(index) count:\(travelTimes.count)")
try! realm.write {
let travelTime = travelTimes[index]
travelTime.travelPhaseIsClosed = true
realm.add(travelTime, update: true)
}
}
}
我在开头加载数据并将它们存储在常量中。 然后我迭代项目并更改查询的条件,以便在我再次查询时获取的数据会发生变化。但我没有。甚至更令人惊讶的是,常数numberOfTravelTimes甚至可以调整,如下面的日志中所示。
index:0 count:5
index:1 count:4
index:2 count:3
index:3 count:2 --> BAM - Exception
这里发生了什么?我怎样才能保存在我的例子中?
答案 0 :(得分:0)
您应该以相反的顺序迭代结果。
for index in (0 ..<numberOfTravelTimes-1).reverse()
看看是否有帮助
答案 1 :(得分:0)
Realm Results
objects are live,这意味着如果您以不再符合Results
查询的方式更新对象,Results
对象将更新以排除它。这意味着当你将for
循环基于Results
对象时需要小心,因为如果Results
对象在循环中间发生变异,你将会结束除了。
通常,最简单但不是最优雅的方法是将Results
对象中的所有Realm对象复制到静态数组中,以便在循环期间不会发生变异。 / p>
但是,在这种特殊情况下,将整个for
循环包含在Realm写入事务中更为合适。这通常是最好的做法(因为它最好批量尽可能多的Realm写入尽可能少的写入事务),但在这种情况下,它将具有不更新{{1}的内容的额外优势直到你完成它为止。
Results