2017-01-20 6 views
0

RESTfulAPI私は大きなデータセットを取得しています。レルムトランザクションの処理

func addObjectType(object: ObjectType){ 
    // Check for existence of data 
    if (realm.object(ofType: ObjectType.self, forPrimaryKey: object.id) == nil) { 
     // Persist your data easily 
     try! realm.write { 
      realm.add(object) 
     } 
    } 
} 

アプリがローカルにデータを削除する機能を持っている:私はレルムと、次の呼び出しを使用してローカルに永続化しています。私は次としてそれを実装している:

func deleteAllData() { 
    if(!realm.isEmpty){ 
     do{ 
      if(!realm.isInWriteTransaction) { 
       realm.beginWrite() 
       realm.deleteAll() 
       try! realm.commitWrite() 
      } 
     } 
     NotificationCenter.default.post(name: Notification.Name("updateUI"), object: nil) 
    } 
} 

をしかし、私は以下を参照してくださいレルムのドキュメントを見て:

は、レルムが書き込みトランザクションに現在あるかどうかを示します。

は、単にこのプロパティをチェックして、オブジェクトが作成、更新、または削除する必要があるときに、書き込みトランザクション を起動しないでください警告

。 を実行すると、多数の書き込みトランザクションが作成され、 のパフォーマンスが低下する可能性があります。その代わり、常に単一のトランザクション中に複数の更新を実行することをお勧めします。

私の実装は正しいですか?

、私はいくつかのチェックをしないのですという感じ..

+0

書き込み/更新の書き込みが完了した後は、必ず 'commitWrite'する必要があります。 'isInWriteTransaction'をチェックする必要はありません。レルムは、パフォーマンスを低下させるのでチェックしないでください。 – Tj3n

+0

新しい書き込みを介してオブジェクト? (最初のメソッドaddObjectTypeを参照してください) – mm24

+0

書き込みクロージャを使用する場合は呼び出す必要はありませんが、書き込み終了があるため、ほとんどの場合、 'isInWriteTransaction'のチェックは非常に注意してください – Tj3n

答えて

0

レルムの一般的な経験則は、あなたができる限り多くの書き込みトランザクションを最小限にしようとすべきであるということです。これには、1つのブロック内に複数の書き込みをまとめてバッチ処理し、日付が実際に変更されていない場合は、トランザクションをすべて一緒に回避しようとします。

レルムの書き込みトランザクションは、独立したスレッドに含まれています。バックグラウンドスレッドが書き込みトランザクションを実行している場合、他のスレッド上の他のすべてのトランザクションはブロックされます。その結果、特定のスレッドで書き込みトランザクションが開いていない限り、isInWriteTransactionをチェックする必要はありません。

あなたは余分な小切手を紛失していません。誤って書き込みトランザクションを別の場所で開いていない限り、そこにあるチェックの数を減らすことさえできます。 :)

関連する問題