【问题标题】:akavache not caching in ios simulator/deviceakavache 不在 ios 模拟器/设备中缓存
【发布时间】:2018-08-08 11:50:59
【问题描述】:

使用 xamarin 形式 v.3.1 和 akavache v5 + akavache.sqlite3 v5。

在 app.xaml.cs 中我初始化了 akavache

       BlobCache.ApplicationName = "EF_Cache";
       BlobCache.EnsureInitialized();

为了缓存数据我使用本地机器

       await BlobCache.LocalMachine.InsertObject<List<int>>("FavouriteTeams", FavouriteTeam, TimeSpan.FromDays(300));

我要检索数据

       var FavouritesList = await BlobCache.LocalMachine.GetObject<List<int>>("FavouriteTeams");

以下代码在 android 设备上运行良好,没有问题,但是当我在 ios 设备/模拟器上尝试它时,它没有错误,getobject 只是在重新启动应用程序时返回 null。

是否有任何东西丢失或额外的东西应该在 ios 应用程序的属性或 info.plist 中配置。

【问题讨论】:

  • 总是返回null吗?或者当你重新启动应用程序时?
  • 重启应用时发生

标签: ios xamarin xamarin.forms xamarin.ios akavache


【解决方案1】:

可能发生的情况是,用于保存到本地计算机的 Akavache 库被链接器“优化”。

基本上,这意味着编译器看不到您的 iOS 项目对 DLL 的直接引用,这是将某些内容保存到光盘并将其作为优化删除所需的。 Akavache 处理它的方式是静默失败回到内存模式。

要解决这个问题,您需要包含一个类,该类对程序集中的类进行一些虚拟代码引用,否则这些类会“链接出”。您可以在projects' GitHub 上找到它以及更多信息。

将此类添加到您的 iOS 项目中,最好也将其添加到您的 Android 项目中。

public static class LinkerPreserve
{
  static LinkerPreserve()
  {
    var persistentName = typeof(SQLitePersistentBlobCache).FullName;
    var encryptedName = typeof(SQLiteEncryptedBlobCache).FullName;
  }
}

加上这个,问题应该就解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多