2016-12-19 11 views
5

これは、GCDを使用して領域にアクセスすることに関するドキュメントの内容です。autoreleasepoolで領域を使用する正しい方法は何ですか?

「ディスパッチキューからレルムにアクセスするときは、明示的な自動解放プールを使用する必要があります。

Documentation

は、私は私のアプリでこの練習を使用しているが、私は突然、私のコンソールに次のメッセージを見ています: 「RLMRealmインスタンスは、書き込みトランザクション中に割り当てが解除されました」。

これはエラーを投げているわけではありません。ただメッセージをコンソールに表示しているだけです。データベースには何も書き込まれません。

非常によく似ているgithubにこの問題が見つかりました。

私の質問は今です:どのような練習をすればよいですか? Realmのドキュメントやgithubの問題で見つかった答えに使われているものは?

ありがとうございます。

答えて

3

レルムが読み取り維持(このSO answerを参照してください)

GCDブロックは、独自の@autoreleaseプールを管理、それが実際に発生するという保証はありませんし、ブロック自体が完了した後に、それはかなりの時間が起こることがありスレッド間ですべてのインスタンスをロックします(これは、書き込みトランザクションが別のスレッドで開いている間にRealmから読み込むことができるためです)。その結果、完了したらRealmインスタンスを明示的に解除することをお勧めしますディスクスペースを再利用することができます。

@autoreleasepoolを使用しない場合は、それほど悪いことはありません。ディスク上のRealmファイルのサイズが大きくなります。

@autoreleasepoolブロックを使用し、すべての書き込みトランザクションがブロック内で確実にコミットされるようにすることをお勧めします。

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

通常、それはあなたが安全にコミットすることを忘れずに取引を行うことができますし、また、いくつかの余分なエラーハンドリングを提供するのでbeginWrite()/commitWrite()realm.writeを使用することをお勧めします。

GitHubの問題点は、書き込みトランザクションがコミットされる前に@autoreleasepoolが終了するようなロジックパスがあることでした。この場合、コードロジックを見直して、似たものがないことを確認する必要があります。

+0

'何も悪いことは起こりません。ディスク上のRealmファイルのサイズだけが増えます。「時間がかかりすぎると、Realmのサイズが(同時スレッドの数によって)大幅に増加する可能性があります。 – EpicPandaForce

+0

ここでは該当しません。これは、長期実行トランザクションがトランザクション・ログ・サイズを増加させるときです。背景を排水しないRealmインスタンスはサイズを大幅に増加させることはありませんが、必要以上に大きくなる原因になりました。いずれにせよ、私たちはトランザクションログの問題を認識しており、解決策に取り組んでいます:https://github.com/realm/realm-core/issues/2343 :) – TiM

関連する問題