gpt4 book ai didi

ios - 在不提交的情况下修改 Array 中的 Realm 对象?

转载 作者:可可西里 更新时间:2023-11-01 00:55:34 26 4
gpt4 key购买 nike

我正在更新一个 Realm 对象数组:

for offer in offers {
if(offer.isReward == isReward){
offer.isSeen = true
}
}

但是它抛出一个错误:

尝试在写入事务之外修改对象 - 首先在 RLMRealm 实例上调用 beginWriteTransaction。

我知道我可以通过以下方式让它工作:

for offer in offers {
if(offer.isReward == isReward){
try! offer.realm?.write {
offer.isSeen = true
}
}
}

无论如何,在我对数组中的所有元素进行更改并提交整个数组之前,我是否可以推迟写入 Realm?为每个需要更改的对象都有一个写事务似乎效率很低。

我原本的计划是修改item,批量更新

 try realm.write {
realm.add(offers, update: true)
}

最佳答案

对托管 Realm 对象的所有更改都需要在写入事务中发生。您不能修改托管对象,然后将更改写入 Realm,因为托管对象“永远不会离开”Realm,因此您对其所做的任何更改都将立即保存。

在没有看到关于您的代码的更多上下文的情况下,我无法为您提供具体的实现,但通常(至少)有两种方法可以解决此问题。

首先,您始终可以创建托管对象的副本,然后逐个修改这些副本的值,完成后在单个写入事务中从其副本更新所有托管对象。但是,这需要在内存中存储两倍的对象,因此这不是最佳解决方案。

第二种方案更优,但只适用于特定场景。您可以简单地将当前拥有的整个代码包装在一个写入事务中,并遍历写入事务中的托管对象。这样,您只使用一个事务,但更新所有托管对象而不制作它们的副本。但是,您不应该在写入事务中执行计算量大的过程,因此如果您需要在更新对象时执行长期任务,这也不是最佳解决方案。

没有单一的写事务的好方法。在单个事务中更新的对象数量与使用多个事务更新少量对象之间存在权衡。

关于ios - 在不提交的情况下修改 Array 中的 Realm 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49436089/

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