3

非常に単純で一般的な使用例ですが、私は満足のいく答えを見つけることができません。 私はいくつかのデータをローカルに保存する必要があるネイティブのアプリケーションに対応しています。私はreduxとredux-observablesとRealmをストレージとして使用しています。Reactネイティブ計算の重いタスク

私が必要とするのは、いくつかのアクションが発生します.ADD_ITEMとしましょう。私はいくつかのペイロード(標準redux)でUIを更新する必要があります。次に、そのペイロードを作成して別のデータに変換し、そのデータをレルムに(非同期に)保存します。私が何をしようと、それは常にUI(多く)です。

私はそのrealm呼び出しを約束してswitchMapを使用しようとしましたが、まだ遅いです。

私はまだ労働者を見たことはありませんが、文字列を受け入れるだけです。これは、私にはあまり役に立たないと言いましょう。

この計算をネイティブのバックグラウンドスレッドに完全にオフロードできますが、それは非常に不快で多くの書き込みになります。

async await help me?レジェククス - サガの?本当の非同期処理ではなく、同じことだと思います。

これは完全に間違ったライブラリを使用していますか?一般的に

const insertOrderItem = (action$) => 
    action$.ofType(Action.ADD_ORDER_ITEM) 
     .switchMap(({ payload }) => Rx.Observable.fromPromise(
      new Promise((resolve, reject) => { 
       storage.insert(createObject(payload) 
       resolve({ 
        type: "OPERATION_ADDED" 
       }) 
      }) 
     )) 

、レルムに小さなデータを格納すると、そのくらいの計算重くなるが、それはバックグラウンドスレッド上のジョブのこの種を行うことが必要だような気がしてはいけません。

何か不足していますか?

おかげ

答えて

2

JSは、1つのスレッドで実行されるので、それはラグです。したがって、プロミスでコードをラップすると、それはまだ1つのスレッドにあります。

私はリアクションネイティブブリッジを介してネイティブにデータを転送し、ネイティブコードでこの変換を行うのに最適なソリューションだと思います。 For guide how to communicate with native code look here

0

私はRealmに精通していませんが、使用しているstorage.insert APIが見つからないようです。私はrealm.write()取引を見るだけです。本当に非ブロッキングの非同期APIを持っているかどうかを確認しようとしていましたが、RealmはJavaScriptバインディングのためのAPIを提供していないようです。

彼らはexecuteTransactionAsync()のJavaバインディングで非ブロッキングAPIを提供しているようですが、これはおそらくオプションではありません。別のスレッド上でネイティブにそれを行う、または書き込みオーバーヘッド削減する方法をいくつか私と同じ問題を抱えていた

+0

storage.insertはrealm.writeのラッパーです。ええ、Javaは助けにはなりませんが、ありがとう。 – trubi

3

(小さなオブジェクトは、それが顕著ではない時などに書き込み):

は次のようになり、あなたのオプションのように思えますReact Native + Realm DBを使用して私のアプリ。私は、ネイティブコードを書くと反応し、ネイティブネイティブから橋を作ることなく、すべての方法を試みたが、最終的に私は解決策が見つかりました:

https://corbt.com/posts/2015/12/22/breaking-up-heavy-processing-in-react-native.html

  1. npm install next-frame --saveをインストールします。
  2. はそのための時間がかかった範囲内の行を追加します。あなたのコードimport nextFrame from 'next-frame';
  3. に次のフレームを追加し、またはそのためのawait nextFrame();

完全な例は次のようになりますDBに挿入します。

import nextFrame from 'next-frame'; 

let response = await fetch("https://emberall.com/user/1/recordings"); 
let responseJSON = await response.json(); 

for (let recording of responseJSON.recordings) { 
    await nextFrame(); // The javascript will yield here and not resume execution until the next frame. 
    mergeRecordingToLocalDatabase(recording); 
} 

基本的には、すべての繰り返しまたはdb-insertでは、JSがレンダリングされて次のUIフレームを処理するまで待機しているため、アプリが停止またはフリーズすることはありません。

P.D:質問から数ヶ月が経過していることを知っていますが、多くの人がこれで恩恵を受けると思います。