2017-11-02 4 views
0

Ich bin mit dem ES2015 Klasse Schema Modell:Eine Schleife innerhalb von realm.write() oder umgekehrt?

class Person { 
    get fullName() { 
    return this.firstName + ' ' + this.lastName; 
    } 
} 

Person.schema = { 
    name: 'Person', 
    properties: { 
    firstName: 'string', 
    lastName: 'string' 
    } 
}; 

nehme ich eine lange Liste von Menschen haben, und jeder Gegenstand wird in einer Schleife aktualisiert werden. Ich finde, dass im Debug-Modus der Schreibblock innerhalb der Schleife schneller ist als die Schleife innerhalb eines Schreibblocks.

Schneller:

componentDidMount(){ 
    realmWorker.addListener(()=>{ 
     console.log('from search screen'); 
    }) 
} 

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

Langsamer:

realm.write(()=>{ 

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

}) 

Aber ich las, dass das Dokument so wenig Schreib transcations wie möglich vorzieht mit:

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

Also sollte ich die gesamte Schleife innerhalb des Schreibblocks?

Antwort

2

Eine Schreibtransaktion ist atomar und es ist alles oder nichts. Das bedeutet, dass die Änderungen in einer Transaktion eine logische Änderungsmenge sein sollten. Wenn Sie zwei Objekte ändern und eine Konsistenz zwischen diesen beiden Objekten benötigen, sollten die Änderungen in einer einzigen Transaktion ausgeführt werden. Wenn die Änderungen unabhängig sind, können (und wahrscheinlich sollten) Änderungen in zwei Transaktionen vorgenommen werden.

Das obige ist die Theorie :-) Was wir in der Dokumentation schreiben, ist, dass Transaktionen teuer sind. Der Grund dafür ist, dass Transaktionen Sperren erhalten müssen und Änderungen in den Speicher geschrieben werden müssen.

Wenn Sie eine RN-Anwendung debuggen, werden die Änderungen weiterhin in den Speicher geschrieben, aber sie werden auch an Ihren Debugger übermittelt. Dies ist ein langsamer Prozess - siehe zum Beispiel https://github.com/realm/realm-js/issues/491. Meine beste Vermutung ist, dass viele kleine Transaktionen beim Debuggen aufgrund des Kommunikationsaufwands der App/Debugger langsam sind. Im realen Szenario (der Benutzer, der Ihre App verwendet - ohne einen Debugger), ist die Schreibtransaktion außerhalb der Schleife schneller.

Verwandte Themen