问题标签 [akavache]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
225 浏览

system.reactive - Akavache 无法在 Windows 8.1 通用应用程序中运行

我正在尝试在 Windows 通用应用程序中使用 Akavache(目前为 8.1,使用 ReactiveUI 6.5)。

为了确保它与我的架构无关,我做了一个空的解决方案,其中包含所有必要的包和要求(两个平台的 VC++),但我仍然遇到同样的问题。这对我来说是一个障碍,因为我希望我的所有查询都被缓存。

这是代码:

编辑经过一些调试,Windows Phone 8.1 Silverlight 可以工作,而不是 Jupiter。

那么缺少什么?

我正在使用 RXUI 6.5(最新)和 Windows Phone 8.1(Jupiter)(共享通用项目)

更新:Akavache.Sqlite3 导致问题。InMemoryCache 正在工作(删除 Akavache.Sqlite3 “修复”了问题),但不是 Sqlite3。此外,注册 BlobCache 的不同类型的缓存(从https://github.com/akavache/Akavache/blob/3c1431250ae94d25cf7ac9637528f4445b131317/Akavache.Sqlite3/Registrations.cs#L32复制粘贴)显然正在工作。所以我想注册类是'工作不正常,呼叫 new Akavache.Sqlite3.Registrations().Register(Locator.CurrentMutable);不工作。

编辑: 我的临时解决方案是将其复制粘贴我的应用程序中,然后在 BlobCache.ApplicationName 之后调用它。它有效,但从技术上讲,我不应该这样做。

谢谢你的帮助

0 投票
1 回答
2042 浏览

c# - 如果缓存值存在,Akavache GetAndFetchLatest 永远不会获取最新的

我正在尝试在 Xamarin.Forms 项目中使用Akavache GetAndFetchLatest 方法,但它没有按我预期的那样工作,并且希望有人能够发现我哪里出错了。

我正在调用这样的方法:

我的应用程序第一次启动时,FetchOrganizations 方法按预期调用,我可以看到我的本地服务器正在处理请求。但是,一旦 Akavache 缓存了数据,它只会返回缓存,而不会再次调用 FetchOrganizations 方法。我的服务器永远不会看到另一个请求。如果我使用较短的超时时间,缓存到期时将调用 FetchOrganizations 方法。如您所见,我尝试使用 fetchPredicate 参数,但这似乎没有帮助。

有没有另一种方法可以让 GetAndFetchLatest 始终尝试获取新数据?我是否误解了 fetchPredicate 的工作原理?

0 投票
1 回答
919 浏览

json - 如何为 Akavache 设置 JsonSerializerSettings?

我已经为 JSON.NET 设置了全局转换器默认值,如下所示:

这适用于我的其余代码(正在使用“QuestionTypeConverter”并按预期工作),但是,当从 Akavache 缓存中检索对象时,我的“QuestionTypeConverter”被忽略,因此我的对象无法正确反序列化。如何通过 Akavache 强制使用我的自定义类型转换器或让 Akavache 使用 JSON.NET 的默认设置?

0 投票
2 回答
3066 浏览

c# - Akavache 的 GetObject等待时挂起。知道这里有什么问题吗?

我有一个 Xamarin.Forms 应用程序,在我的 App 类中有这段代码(是的,这只是演示问题的示例):

密钥“用户”不存在,所以我希望得到一个 KeyNotFoundException。但是我从来没有看到这个异常被抛出。相反,它只是“挂起”并且永远不会从 await GetObject 调用返回。

我正在使用 Android 5.0 的手机上运行它。

任何想法如何解决这一问题?我在做一些根本错误的事情吗?

更新:附带说明:可以尝试检查密钥是否确实存在于缓存中,然后才从缓存中检索它,而不是立即尝试 GetObject。但是,如果我没记错的话,除了调用 GetObject 并捕获上面示例中的异常之外,没有其他方法可以进行检查。对于只想知道某个项目是否存在的情况,这似乎并不理想。也许在 Akavache 中使用“Exists()”方法会很不错?或者,也许我错过了什么?

Update2:将示例更改为不在构造函数中使用异步方法。只是为了证明这不是问题所在。

Update3:从构造函数中删除调用。当我从代码中的任何位置调用 BlockingGetExternalUser 时,等待仍会挂起。

0 投票
0 回答
71 浏览

c# - 在缓存中持久化派生类型

我想使用 GetAndFetchLatest 将我的派生类型保存在 Akavache 的缓存中,但我遇到了一些困难。我的 POCO 如下:

这些类型存储在 ObserverableCollection 中。GetAndFetchLatest 将它们转换为它们的基本类型(TableCell),我失去了所有多态优势。有没有办法强制缓存将这些对象保存为它们的派生类型?

谢谢!

0 投票
0 回答
418 浏览

windows-phone - Reactive Extensions、Akavache 和 Refit 对于 Windows Phone 的内部卡来说太多了

我想在我的应用程序和akavache/Akavache中使用paulcbetts/refit

问题是根据我的逻辑,Windows Phone 不喜欢我执行以下操作:

我得到学期(从缓存中,然后获取),选择想要的学期(我将 H2014 用于测试),获取所选(许多)学期的时间表(从缓存中,然后获取,如下所示:

如果我使用 5 或更多的 TimeSpan.FromSeconds,它会做我想做的事,就好像我给了 Windows Phone 喘息的时间。否则(5岁以下),我得到的例外情况如下:

抛出异常:mscorlib.ni.dll StackTrace 中的“System.NotSupportedException”:

想要的行为:

  1. 获取缓存学期 -> 获取该学期的缓存计划,获取该学期的计划
  2. 获取学期 -> 获取该学期的缓存计划,获取该学期的计划

我试过了:

  • 在没有 Refit 的情况下链接akavache/Akavache并且它可以工作。
  • 在没有akavache/Akavache的情况下链接 GetSchedule 和 GetSemesters 的选择,它可以工作。

如果你们对工作有想法或我做错了什么,请告诉我!

0 投票
1 回答
881 浏览

c# - 使用 TestScheduler 对 Akavache 的缓存行为进行单元测试

所以我正在尝试在使用 Akavache 的应用程序中测试缓存行为。我的测试如下所示:

SomeApiWrapper使用内部 api(用模拟new Mock<ISomeApi>()) - 为简单起见 - 只返回一个字符串。现在的问题是第二个字符串永远不会返回。处理缓存的SomeApiWrapper类如下所示:

调试只会把我引向这条线return await cachedStrings.FirstOrDefaultAsync();——之后它就永远不会结束。

当我用TestScheduler标准 ( CurrentThreadScheduler.Instance) 和scheduler.AdvanceToMs(5000)with替换 时await Task.Delay(5000),一切都按预期工作,但我不希望单元测试运行多秒钟。

一个类似的测试,其中TestScheduler超过缓存超时也成功。只是这种情况,缓存条目不应该在两个方法调用之间过期。

我使用的方式有什么问题TestScheduler吗?

0 投票
1 回答
2012 浏览

xamarin.forms - 无法让 Akavache 使用 PCL Xamarin Forms 应用程序工作

我已经为此苦苦挣扎了 4 个小时,现在我正在转圈。我正试图让 Akavache 为我的项目运行。该项目是开箱即用的 Xamarin Forms (Portable) 类型。然后使用 Nuget,我添加了 Akavache 4.1.2(还添加了 Akavache Core 和 SqlLite3 以及 ReactiveUI 和 Splat)。然后我更新了 Splat,因为 nuget 包中的依赖项是错误的(是 1.3.3 但应该是 1.6.0)。但是,在添加您应该针对此应用程序的第一行(BlobCache.ApplicationName = "MyApp")时,我仍然在启动此应用程序时遇到错误(目前针对 iOS):

PS 使用 Xamarin 4.1.0 运行 VS 2015 社区

0 投票
0 回答
472 浏览

xamarin - Akavache BlobCache.Secure 在 Android 上为空

我正在尝试使用 Akavache 将数据安全地存储在我的 Xamarin.iOS 和 Xamarin.Android 项目中。在 iOS 上一切似乎都很好,但在 Android 上却失败了,说BlobCache.Secure为空。

在访问缓存之前,我将其设置为:

我试过直接引用它:(BlobCache.SecureSecure null或使用我的 IoC 设置它

但最终的结果是一样的。Android 上 BlobCache 上唯一可用的缓存是 InMemoryCache。

0 投票
1 回答
306 浏览

caching - Akavache 总是调用 fetchFunc

我在 Xamarin 应用程序中使用 Akavache 有以下代码,但它的行为不像我认为的那样。可能是我对它应该是怎样的误解,但这让我发疯。

因此,在我的视图模型中,我正在调用 FetchNewsCategories 并为该项目指定 5 分钟的缓存。我期望发生的是,如果缓存项不存在,它将调用 fetchFunc(即 FetchNewsCategoriesAsync),但如果我在 5 分钟的缓存超时内多次调用该服务,它应该只给我缓存的项目而不是服务器调用。在我尝试过的所有情况下,它都会继续进行其余调用,并且永远不会给我缓存的项目。我也用 GetAndFetchLatest 试过这个,如果有一个缓存的项目,它不会进行其余的调用,但它也不会在视图模型的订阅事件中进行调用。有什么想法我在这里做错了吗?

编辑:我在 Android (Nexus 5 KitKat API19) 上测试了相同的代码,它运行完美。我要重置我的 IOS 模拟器,看看是不是出了问题。

新闻服务.cs

NewsViewModel.cs