领域:常量值的实时更新

时间:2016-10-29 09:45:11

标签: ios swift realm

我正在使用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

这里发生了什么?我怎样才能保存在我的例子中?

2 个答案:

答案 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