使用自定义CacheKey

时间:2019-12-04 21:34:15

标签: android aws-appsync apollo-android appsync-apollo-client

我在Android上使用AWS AppSync(GraphQL)。 AppSync SDK 2.10.0。我认为这也适用于非AppSync Apollo,但我不确定。

如果我实现了一个CacheKeyResolver以指定自定义CacheKey,则我发现从列表查询返回的项目(例如getOrders())被缓存,但是当我随后通过使用列表中某个项目的ID的ID(例如getOrder(5)),则在缓存中找不到该项目。而是将发出网络请求,并将再次缓存该项目。然后将从缓存中返回对getOrder(5)的另一个调用。

使用内置CacheKeyResolver时不会发生此行为。使用内置解析器,通过getOrders()通过ID调用(根据文档 https://aws-amplify.github.io/docs/android/api#client-architecture )可以正确地在getOrder()调用中缓存的所有项目都在缓存中找到。 https://aws-amplify.github.io/docs/sdk/android/api#client-architecture

这是我的Kotlin CacheKeyResolver

object : CacheKeyResolver() {
    override fun fromFieldRecordSet(field: ResponseField, recordSet: MutableMap<String, Any>): CacheKey {
        val t = recordSet["__typename"]
        return formatCacheKey(StringBuilder().append(t).append(recordSet["id"].toString()).toString())
    }

    override fun fromFieldArguments(field: ResponseField, variables: Operation.Variables): CacheKey {
        return CacheKey.NO_KEY
    }

    private fun formatCacheKey(key: String?): CacheKey {
        return if (key == null || key.isEmpty()) {
            CacheKey.NO_KEY
        } else {
            CacheKey.from(key)
        }
    }
}

似乎我做错了什么,或者这是一个错误。我们如何解决这个问题?

除了可能相关之外:我之所以使用自定义CacheKeyResolver的原因是由于我在此处报告的此错误:https://github.com/awslabs/aws-mobile-appsync-sdk-android/issues/242

0 个答案:

没有答案