2016-03-24 4 views
3

私はドキュメントを読んでおり、多くの場合Realmインスタンスでrefreshを手動で呼び出す必要はないことを理解しています。しかし、このかなり一般的なシナリオでは、完了ブロックが次の実行ループの開始前に領域を照会する可能性があるため、必要であることが判明しました。私はバックグラウンドスレッドで書き込み操作を実行することによって、善良な市民されていたが、この呼び出しに伴うオーバーヘッドがやってのポイントを破るならば、今、私はrefreshを呼び出すために持っていることを、私は思ったんだけど思っレルムをリフレッシュするコストはいくらですか?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [[RLMRealm defaultRealm] transactionWithBlock:^{ 
     // Add some RLMObjects 
    }]; 

    if (completion) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [[RLMRealm defaultRealm] refresh]; // necessary if it queries realm 
      completion(); 
     }); 
    } 
}); 

バックグラウンド処理。

だから私の質問は以下のとおりです。

1)Realmrefreshを呼び出すのパフォーマンスコストとは何ですか?

2)このパターンでレルムに1つのオブジェクトを追加すると、おそらく は無意味です。このパターンでいくつのオブジェクトを追加した後、メインスレッドで書き込みトランザクションを同期して実行する代わりに利点がありますか?

答えて

3

本当に素晴らしい質問です!

1)Realmrefreshを呼び出した場合のパフォーマンスコストはいくらですか?

t1; dr;高価ではありません

Realmインスタンスがそのスレッドで拡張されているため、コストはライブの「アクセサ」の数に比例します。レルムObjective-Cのアクセサは、RLMObjects、RLMArrays、RLMResultsです。

レルムが-[RLMRealm refresh]がはるかにgit pull動作と同様、最新の安定した状態にそのレルムの「現在のトランザクションポインタを」進めるの問題で呼び出し、gitのの内部の仕組みに似て、ボンネットの下にMVCC versioning systemを使用しているため。

それは実行ループを持つと(一般的にメインスレッド上のレルムのためのケースです)YESからautorefresh設定したスレッドのレルムのために、-[RLMRealm refresh]は実行ループの反復ごとに自動的に呼び出されることは注目に値します。

ほとんどの場合、非常に個のライブ "アクセサ"がそのスレッドに多数存在しない限り、レルムをリフレッシュするとパフォーマンスにはほとんど影響しません。

2)このパターンでレルムにオブジェクトを1つだけ追加すると、おそらく無意味です。このパターンでいくつのオブジェクトを追加した後、メインスレッドで書き込みトランザクションを同期して実行する代わりに利点がありますか?

t1; dr;バックグラウンドでの書き込みの実行はより安全です

競合のない大部分のケースでは、メインスレッドで書き込みトランザクションを実行するためのオーバーヘッドは、滑らかなUIに必要な1/60秒のしきい値を下回ります。 のレルムでの書き込みはです。です。つまり、大量の書き込みトランザクションがバックグラウンドで同時に発生すると、メインスレッドから同時に書き込むときにメインスレッドがブロックされることになります。スタッターまたはブロック。

この理由から、競合が発生しないことが確実でない限り、バックグラウンドスレッドでは、高速であれ、高速であれ、すべての書き込みトランザクションを実行することをお勧めします。

Realmの厳密なスレッド閉じ込めのアクセッサでは、バックグラウンドスレッドでの書き込みの実行が複雑になることを認識しています。つまり、スレッド間のアクセサの安全なハンドオーバを可能にする非同期書き込み用のAPIの追加を追跡しています。#3136

レルムの読み取り操作は、他の読み取りまたは書き込みによってブロックされないため(上記のMVCCのおかげで!)、どのスレッドでもそれらを実行することは完全に受け入れられます。

+0

非常に有益な回答です、ありがとうございます!私はその後、バックグラウンドのパターンを使用し続けます。 – skensell

+0

@jpsimネットワークの成功/失敗ブロックのような別のブロック内でtransactionWithBlockを使用すると、通常のコミットトランザクションよりも優れていますか? – EmilDo

+0

transactionWithBlockは文字通りbeginWriteTransaction&commitWriteTransactionのショートカットです – jpsim

関連する問題