我有一个与Relay集成的React Native应用程序,我想为用户提供离线优先体验。
因此,在第一个应用程序启动时,应在加载数据时显示占位符。之后,每次启动应用程序时,我都希望在加载新数据时显示最后的缓存数据。
我找到this issue from 2015并基于eyston's answer我尝试使用CacheManager
基于relay-cache-manager实施AsyncStorage
。使用CacheManager,我可以从缓存中保存和加载中继记录,但是当网络被禁用时,应用程序无法显示缓存数据。
当中继获取新数据时,是否有任何使用中继缓存数据的方法?
答案 0 :(得分:5)
我们有一个生产应用,它使用Relay和RealmDB进行离线体验。我们从CacheManager采取了一个单独的方法,因为那时CacheManager还没有完全准备好。我们使用了relay-local-schema。
我们使用relay-local-schema定义了移动设备所需的整个架构。这可能与您的后端服务器用于定义graphql架构和更改解析函数以解析来自realm db的数据的文件相同。为此,我们还在realmdb中创建了模式,该模式与graphql模式具有几乎相同的结构,以简化将后端服务器返回到realmdb的数据。您还可以使用graphql内省查询自动生成此模式。我们定义了custom network layer,我们确保所有中继查询始终触及本地数据库。在sendQueries
函数中,所有查询都使用relay-local-schema解析,该解析非常快,反应视图显示旧数据,同时在sendQueries
函数中为每个请求发出网络请求。在从网络请求接收数据时,它在realmdb中写入,并且内存中的内存也存储有新数据,这会自动刷新其数据发生变化的所有反应视图。要将数据写入Relay内存存储区,我们使用了以下未记录的方法
Relay.Store.getStoreData().handleQueryPayload(query, response);
您可以使用request.getQuery()
在sendQueries函数中从您收到的请求中获取查询对象。
我们当前的实现与业务逻辑有点紧密相关,因此很难开源这个逻辑。我会尝试提供一个演示应用程序。