realm.write()内部的循环还是相反



我使用的是ES2015类模式模型:

class Person {
get fullName() {
return this.firstName + ' ' + this.lastName;
}
}
Person.schema = {
name: 'Person',
properties: {
firstName: 'string',
lastName: 'string'
}
};

假设我有一个很长的人员列表,每个人员项目都将在循环中更新。我发现,在调试模式下,将写块放在循环中比将循环放在写块中更快。

更快:

componentDidMount(){
realmWorker.addListener(()=>{
console.log('from search screen');
})
}
onClick=()=>{
let persons = realm.objects('person');
persons.forEach(person=>{
realm.write(()=>{
person.age++;
// More complicated updates.
})
}) 
}

较慢:

realm.write(()=>{
let persons = realm.objects('person');
persons.forEach(person=>{
person.age++;
// More complicated updates.
}) 
})

但我读到,该文件更喜欢尽可能少的书面交易:

Note that write transactions have a non-negligible overhead; you should try to minimize the number of write blocks within your code.

那么我应该把整个循环放在写块里吗?

写事务是原子事务,它要么全部要么全无。这意味着事务中所做的更改应该是一个逻辑更改集。如果您更改了两个对象,并且需要在这两个对象之间保持某种一致性,那么这些更改应该在一个事务中完成。如果更改是独立的,则可以(也可能应该)在两个事务中进行更改。

以上就是理论:-)我们在文档中所写的是交易是昂贵的。原因是事务必须获取锁,并且必须将更改写入存储。

当您调试RN应用程序时,更改仍会写入存储,但也会传递给调试器。这是一个缓慢的过程-例如,请参阅https://github.com/realm/realm-js/issues/491.我的最佳猜测是,由于应用程序/调试器的通信开销,许多小型事务在调试时速度较慢。在现实场景中(用户使用您的应用程序-没有调试器),循环外的写入事务会更快。

相关内容

  • 没有找到相关文章

最新更新