Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何配置MvvmCross以持久化缓存的映像_Iphone_Ios_Xamarin.ios_Mvvmcross - Fatal编程技术网

Iphone 如何配置MvvmCross以持久化缓存的映像

Iphone 如何配置MvvmCross以持久化缓存的映像,iphone,ios,xamarin.ios,mvvmcross,Iphone,Ios,Xamarin.ios,Mvvmcross,这是一个没有答案的问题 我使用了MvvmCross示例中的代码,并且我能够用我的项目运行MvxImageViewLoader。它为应用程序的当前实例缓存图像,但如果我重新启动它,所有图像都将重新加载。我想将它们永久保存在iPhone的Library\Caches文件夹中 我注意到在应用程序日志中有一行: mvx: Warning: 2.25 Persistent download cache will not be available - no text serializer availab

这是一个没有答案的问题

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

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

mvx: Warning: 2.25 Persistent download cache will not be available - no text serializer available mvx:警告:2.25永久下载缓存将不可用-没有可用的文本序列化程序
它来自框架的
MvxFileDownloadCache
类,因为IoC容器没有为
imvxtSerializer
接口注册的类。所以我假设如果我为这个接口定义我的实现,那么带有永久缓存的解决方案将以某种方式工作。尽管该接口的性质似乎可疑,但它用于将图像保存到磁盘,因为它使用对象进行序列化,使用字符串进行反序列化。所以我实际上很困惑,也不知道该走哪条路。

正如我在回答未回答的问题时所回答的,在wp、winrt、xamarin.android和xamarin.touch上显示http上的图像显示在这两个N+1视频中:

  • 小猫-N=2-
  • 书籍-N=6-
第二种方法是使用插件nuget软件包跨会话下载和保存图像:

  • MvvmCross.HotTuna.Plugin.DownloadCache
  • MvvmCross.HotTuna.Plugin.File
  • MvvmCross.HotTuna.Plugin.Json
我真的很困惑,不知道该走哪条路


显然,MvvmCross的下载代码只是一种实现——有证据表明基于Mono httpwebrequest的下载不是100%可靠的——请参阅。用户可以自由地实现自己的图像下载插件-例如,使用类似于的iOS代码。

嗯,显然这个问题很容易解决。您只需确保您的ios项目引用了MvvmCross libs集合中的cirrius.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();
    }
公共类设置:MvxTouchSetup
{
公共设置(MVXApplicationLegate appDelegate、IMvxTouchViewPresenter演示器)
:base(appDelegate、演示者)
{
}
受保护的覆盖IMvxApplication CreateApp()
{
返回新的YourAppClass();
}
受保护的覆盖无效AddPluginLoaders(MvxLoaderPluginRegistry注册表)
{
registry.AddConventionalPlugin();
registry.AddConventionalPlugin();
base.AddPluginsLoaders(注册表);
}
受保护的覆盖无效初始值ElastChance()
{
cirrial.MvvmCross.Plugins.DownloadCache.PluginLoader.Instance.EnsureLoaded();
cirrial.MvvmCross.Plugins.File.PluginLoader.Instance.EnsureLoaded();
cirrial.MvvmCross.Plugins.Json.PluginLoader.Instance.EnsureLoaded();
base.initializeElastChance();
}
}


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

感谢您的评论,我终于解决了此问题。虽然我花了一些额外的时间,因为我没有注意到您提到也必须有Json插件引用。由于它没有与MvvmCross二进制文件一起分发(我想这是因为与Newtonsoft.Json.dll的链接),因此我忽略了我没有将其添加到项目中。