2017-03-05 46 views
5

我有一个与中继集成的React Native应用程序,我希望为用户提供离线优先体验。在反应本机应用程序上使用中继缓存数据,同时获取新鲜数据

所以,在所述第一应用程序启动时被加载的数据的占位符应该被显示。之后,每次启动应用程序时,我都希望在加载新数据时显示上次缓存的数据。

我发现this issue from 2015,并根据eyston's answer我使用AsyncStorage试图执行一个CacheManager基于relay-cache-manager。通过CacheManager,我可以保存和加载来自缓存的中继记录,但是当网络被禁用时,应用程序无法显示缓存数据。

是否有使用继电器缓存数据的任何方式,而继电器获取新的数据?

回答

5

我们有一个生产应用程序,它采用继电器和RealmDB用于离线经验。我们从CacheManager采取了单独的方法,因为当时CacheManager还没有做好准备。我们使用relay-local-schema

我们定义了使用继电器本地架构移动所需的整个架构。这可能与您的后端服务器用于定义graphql模式的文件相同,并更改解析函数以解析来自领域数据库的数据。为此,我们还在realmdb中创建了架构,该架构与graphql架构几乎相同,以便将后端服务器返回的数据写入realmdb。您还可以使用graphql introspection查询自动生成此模式。我们定义了一个custom network layer,我们确保所有的Relay查询总是接触本地数据库。在sendQueries函数中,所有查询都通过relay-local-schema进行解析,解析速度非常快,反应视图显示旧数据,同时在sendQueries函数中为每个请求提出网络请求。在从网络请求接收数据时,它将写入realmdb中,并且中继内存中存储的数据也将填充新数据,这会自动刷新其数据更改的所有反应视图。为了将数据写入到继电器内存存储我们使用以下方法无证

Relay.Store.getStoreData().handleQueryPayload(query, response); 

您可以从您在sendQueries功能接收使用request.getQuery()请求获得查询对象。

我们当前的实现是有点忙不过来与我们的业务逻辑,因此它是很难开源这个逻辑。我会尽量提供一个演示应用程序是可能的。

+0

感谢您的快速回复@meteors。 我想过使用中继本地模式,但我放弃了,因为我不喜欢进口的想法'GraphQLSchema'我的应用程序(该模式是在单独的项目中定义的,我不希望把它绑起来)。在你的回应后,我发现[json-to-graphql-schema](https://github.com/aweary/json-to-graphql)存储库。我将尝试使用babel-relay-plugin使用的json模式。 –

+0

很高兴看到您的实施。 我知道很难将您的业务逻辑与代码分开,并创建一个具有演示的存储库,因此,如果您可以使用自定义网络层和RealmDB更新的示例代码创建要点,我将不胜感激。代码不需要工作= D。 无论如何,我会尝试使用本地模式的方法。当我取得一些进展时,我会在这里更新。 –

+0

好吧,我会尽快添加一个要点或演示应用程序。 – meteors

相关问题