Iphone 如何配置MvvmCross以持久化缓存的映像
这是一个没有答案的问题 我使用了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
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-
- 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的链接),因此我忽略了我没有将其添加到项目中。