这是一个跟未答复的问题Image Caching from http sources的问题。
我使用了MvvmCross样本中的代码,我可以用我的项目运行MvxImageViewLoader
。它为应用程序的当前实例缓存图像,但如果我重新启动它,则所有图像将再次重新加载。我想让它们在iPhone的Library \ Caches文件夹中保持不变。
我注意到在应用程序日志中有一行:
mvx: Warning: 2.25 Persistent download cache will not be available - no text serializer available
它来自框架的MvxFileDownloadCache
类,因为IoC容器没有IMvxTextSerializer
接口的注册类。所以我假设如果我为这个接口定义我的实现,那么具有永久缓存的解决方案将以某种方式工作。虽然界面的性质似乎可疑用于将图像保存到磁盘,因为它使用对象序列化和字符串进行反序列化操作。所以我真的很困惑,无法意识到要走哪条路。
答案 0 :(得分:5)
正如我在回答未回答的问题时回答的那样,在这两个N + 1视频中显示了来自http的wp,winrt,xamarin.android和xamarin.touch上的图像:
第二个下载并使用插件nuget包在会话中保留图像:
我其实很困惑,也无法意识到要走哪条路。
显然,MvvmCross的下载代码只是一种实现 - 并且有一些证据表明基于Mono-httpwebrequest的下载不是100%可靠 - 请参阅MvxDynamicImageHelper unreliable。用户可以自由地实现他们自己的图像下载插件 - 例如使用来自iOS: Download image from url and save in device的iOS代码。
答案 1 :(得分:2)
嗯,显然这个问题很难解决。您只需要确保您的ios项目从MvvmCross libs集引用了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模拟器中查看了我的应用程序Caches文件夹,在Pictures.MvvmCross文件夹中找到了大量的缓存图像,但是根据MvvmCross框架的源代码,还必须有带有序列化实体列表的Pictures.MvvmCross_CacheIndex.txt来提供缓存引擎加载现有图像文件列表的方法。由于缺少序列化程序,因此未创建此列表文件,因此在下一个应用程序重新启动时,所有关于现有已加载图像的信息都将丢失。