gpt4 book ai didi

ios - Realm :常量值的实时更新

转载 作者:行者123 更新时间:2023-11-28 08:24:54 26 4
gpt4 key购买 nike

我正在使用 SwiftRealm 2.03,不明白如果 Realm 中的数据发生变化,常量数据(甚至元数据)如何更新的魔力......

举个例子:

 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

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

最佳答案

Realm Results objects are live ,这意味着如果您以不再符合 Results 查询的方式更新对象,则 Results 对象将更新以排除它。这意味着当您将 for 循环基于 Results 对象时需要小心,因为如果 Results 对象在循环的中间发生变异循环,你最终会遇到异常。

通常,缓解这种情况的最简单但不是最优雅的方法是将 Results 对象中的所有 Realm 对象复制到静态数组,这样它就不会在循环期间发生变化。

然而,在这种特殊情况下,将整个 for 循环包含在 Realm 写事务中会更合适。这通常是最佳实践(因为最好将尽可能多的 Realm 写入批处理到尽可能少的写入事务中),但在这种情况下,它具有不更新 Results 内容的额外优势反对直到你完成它。

try! realm.write { // Open the Realm write transaction outside of the loop
for index in 0..<numberOfTravelTimes-2 {
print("index:\(index) count:\(travelTimes.count)")

let travelTime = travelTimes[index]
travelTime.travelPhaseIsClosed = true
realm.add(travelTime, update: true)
}
}

关于ios - Realm :常量值的实时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40317831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com