2016-12-19 3 views
5

Dies ist, was die Dokumentation über den Zugriff auf einen Bereich mit GCD zu sagen hat: „Sie sollten einen expliziten Autofreigabepool verwenden, wenn einen Realm von einer Absende-Warteschlange Zugriff auf“Was ist der richtige Weg Realm in einem Autorespulepool zu benutzen?

Documentation

Ich habe diese Praxis in meiner app verwendet, aber ich in meiner Konsole die folgende Meldung plötzlich sehe: „RLMRealm Instanz wurde während einer Schreibtransaktion freigegeben“.

Es wird kein Fehler ausgegeben, es wird lediglich still auf die Konsole gedruckt. Nichts wird in die Datenbank geschrieben.

Ich fand dieses Problem auf github, die sehr ähnlich scheint.

Meine Frage ist jetzt: Welche Praxis sollte ich verwenden? Der in der Realm-Dokumentation verwendete oder die im GitHub-Problem gefundene Antwort?

Danke für jede Klarstellung.

Antwort

3

GCD Blöcke ihre eigenen @autorelease Pools verwalten, aber es gibt keine Garantie, wenn diese tatsächlich auftreten, und es kann eine Menge Zeit nach dem Block passieren selbst (siehe diese SO answer)

Realm hält Read- abgeschlossen sperrt alle seine Instanzen über Threads hinweg (So ist es möglich, immer noch von Realm zu lesen, während eine Schreibtransaktion in einem anderen Thread geöffnet ist). Daher wird empfohlen, eine Realm-Instanz explizit zu deallozieren, wenn Sie damit fertig sind Speicherplatz kann zurückgewonnen werden.

Wenn Sie kein @autoreleasepool verwenden, wird nichts Schlimmes passieren; nur die Größe der Realm-Datei auf der Festplatte wird zunehmen.

Es empfiehlt sich, einen @autoreleasepool-Block zu verwenden und sicherzustellen, dass alle Ihre Schreibtransaktionen in diesem Block festgeschrieben werden.

@autoreleasepool { 
    let realm = try! Realm() 
    try! realm.write { 
     // ... perform changes 
    } 
} 

Es ist in der Regel realm.write über empfohlen beginWrite()/commitWrite() zu verwenden, da es Ihnen sicher Transaktionen durchführen, ohne zu vergessen, kann zu begehen, und bietet auch eine gewisse Handhabung zusätzliche Fehler.

Das Problem mit dem Thema auf GitHub war, dass es ein logischer Weg war, dass die @autoreleasepool zu beenden, bevor die Schreibtransaktion begangen worden verursachen würde. In diesem Fall müssen Sie Ihre Code-Logik überprüfen und sicherstellen, dass Sie nichts Ähnliches haben.

+0

'nichts wird so schlimm passieren; nur die Größe der Realm-Datei auf der Festplatte erhöht sich. Wenn es zu lange dauert, kann Ihre Realm-Größe jedoch drastisch steigen (abhängig von der Anzahl der gleichzeitigen Threads). – EpicPandaForce

+0

Das trifft hier nicht zu. In diesem Fall erhöhen lang laufende Transaktionen die Größe des Transaktionsprotokolls. Nicht herunterladende Realm-Instanzen haben die Größe nie "drastisch" erhöht, aber sie haben dazu geführt, dass sie mehr als nötig gewachsen sind. In jedem Fall ist uns das Transaktionsprotokoll bekannt und wir arbeiten an einer Lösung: https://github.com/realm/realm-core/issues/2343 :) – TiM

Verwandte Themen