7

非常简单和常见的用例,但我找不到令人满意的答案。我有需要在本地存储一些数据的本机应用程序。我正在使用 redux 和 redux-observables 以及 Realm 作为存储。

我需要的是:发生一些动作,比如说 ADD_ITEM。我需要使用一些有效负载(标准 redux)来更新 UI。然后我想将该有效负载创建/转换为另一段数据并将该数据保存到领域(异步)。无论我尝试什么,它总是落后于 UI(很多)。

我试图将该领域调用包装成 promise 并使用 switchMap,但它仍然很慢。

我还没有看过工人,但他们只接受字符串,这对我来说用处不大。

我可以将计算完全卸载到本机后台线程,但这会非常不舒服并且需要大量的写作。

异步等待可以帮助我吗?redux-saga 的?我觉得这是一回事,而不是真正的异步处理。

还是我为此使用了完全错误的库?

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"
                })
            })
        ))

一般来说,将一小块数据存储到领域不应该有太多的计算量,但我觉得有必要在后台线程上做这种工作。

我错过了什么吗?

谢谢

4

3 回答 3

7

我的应用程序使用 React Native + Realm DB 时遇到了同样的问题。我尝试了各种方法,无需编写原生代码,搭建从 react-native 到 native 的桥梁,最后找到了解决方案:

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

  1. 安装npm install next-frame --save.
  2. 将下一帧添加到您的代码中import nextFrame from 'next-frame';
  3. 将此行添加到需要很长时间的 for that 或 for which insert in DBawait nextFrame();

一个完整的示例如下所示:

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 帧,因此您的应用程序不会卡住或冻结。

PD:我知道问题已经过去了几个月,但我认为很多人都可以从中受益。

于 2017-11-15T13:56:55.317 回答
2

这是滞后的,因为 JS 在一个线程中运行。因此,如果您将代码包装在 Promise 中,它仍然在一个线程中。

我认为最适合您的解决方案是通过 React Native 桥将数据传输到本机,并在本机代码中进行此转换。有关如何与本机代码进行通信的指南,请查看此处

于 2017-03-14T15:40:11.230 回答
0

我不熟悉 Realm,但我似乎找不到storage.insert您正在使用的 API。我只看到realm.write()交易。我试图看看他们是否有一个真正的非阻塞异步 API,但似乎 Realm 没有为他们的 JavaScript 绑定提供一个。

他们似乎在其 Java 绑定中提供了非阻塞 API,executeTransactionAsync()但这对您来说不太可能是一个选择。

似乎您的选择是:在另一个线程上以本机方式执行,或者以某种方式减少写入开销(较小的对象,在不明显的时间写入等)

于 2017-03-15T19:04:27.773 回答