4

这是一个未回答的来自 http 来源的图像缓存之后的问题。

我使用了 MvvmCross 示例中的代码,并且能够运行MvxImageViewLoader我的项目。它缓存应用程序当前实例的图像,但如果我重新启动它,所有图像都会再次重新加载。我想让它们永久保存在 iPhone 的 Library\Caches 文件夹中。

我注意到在应用程序日志中有一行:

mvx:警告:2.25 永久下载缓存将不可用 - 没有可用的文本序列化程序

它来自框架的MvxFileDownloadCache类,因为 IoC 容器没有为IMvxTextSerializer接口注册的类。所以我假设如果我为这个接口定义我的实现,那么具有永久缓存的解决方案将以某种方式工作。尽管该接口的性质似乎对用于将图像保存到磁盘的做法很可疑,因为它使用要序列化的对象和要反序列化的字符串进行操作。所以我实际上很困惑,无法意识到该走哪条路。

4

2 回答 2

5

As answered in my answer to the unanswered question, showing images on wp, winrt, xamarin.android and xamarin.touch from http is shown in these two N+1 videos:

The second of these downloads and persists images across sessions using the plugin nuget packages:

  • MvvmCross.HotTuna.Plugin.DownloadCache
  • MvvmCross.HotTuna.Plugin.File
  • MvvmCross.HotTuna.Plugin.Json

I am actually confused and can't realize which way to go.

Obviously MvvmCross' download code is only one implementation - and there is some evidence that Mono-httpwebrequest-based download is not 100% reliable - see MvxDynamicImageHelper unreliable. Users are free to implement their own image download plugins - e.g. using iOS code like from iOS: Download image from url and save in device.

于 2013-07-19T06:54:59.853 回答
2

好吧,显然这个问题很容易解决。您只需要确保您的 ios 项目引用来自 MvvmCross 库集的 Cirrious.MvvmCross.Plugins.Json 库(您必须使用指向 Newtonsoft.Json.dll 的链接来构建它)。另外不要忘记在您的应用程序中注册插件。基本上,这是为您提供所有 MvxImageViewLoader 已加载图像的缓存和持久化的配置:

public class Setup : MvxTouchSetup
{
    public Setup (MvxApplicationDelegate appDelegate, IMvxTouchViewPresenter presenter)
        : base(appDelegate, presenter)
    {
    }

    protected override IMvxApplication CreateApp()
    {
        return new YourAppClass();
    }

    protected override void AddPluginsLoaders(MvxLoaderPluginRegistry registry)
    {
        registry.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.DownloadCache.Touch.Plugin>();
        registry.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.File.Touch.Plugin>();

        base.AddPluginsLoaders(registry);

    }

    protected override void InitializeLastChance ()
    {
        Cirrious.MvvmCross.Plugins.DownloadCache.PluginLoader.Instance.EnsureLoaded();
        Cirrious.MvvmCross.Plugins.File.PluginLoader.Instance.EnsureLoaded();
        Cirrious.MvvmCross.Plugins.Json.PluginLoader.Instance.EnsureLoaded();

        base.InitializeLastChance();
    }

}

我对控制台日志行的初步观察是没有文本序列化程序是解决问题的关键。我在 iPhone Simulator 中查看了我的应用程序 Caches 文件夹,并在 Pictures.MvvmCross 文件夹中发现了大量缓存图像,但根据 MvvmCross 框架的源代码,还必须有带有序列化实体列表的 Pictures.MvvmCross_CacheIndex.txt 给缓存引擎加载现有图像文件列表的方式。由于缺少序列化程序,未创建此列表文件,因此在下一次应用程序重新启动时,有关现有加载图像的所有信息都丢失了。

于 2013-07-26T21:57:59.883 回答