从MvvmCross Plugins.DownloadCache获取文件名/路径

时间:2014-10-23 07:58:11

标签: xamarin mvvmcross

我目前正在使用MvvmCross DownloadCache - 它工作正常 - 特别好,当我只需要放入一个图像URL并自动下载/缓存图像并提供UIImage。

我希望将代码用于另一个用例 - 我想从URL获取源图像并将文件缓存在本地文件系统上,但我真正想要的其他用例是本地文件系统上的图像路径而不是UIImage本身。

如果我能得到一个如何实现这一目标的例子,对我最有帮助的是什么。是否有可能在PCL中实现,或者是否需要进入特定于平台的代码?

2 个答案:

答案 0 :(得分:2)

谢谢 - 这是有效的,但为了防止其他人跟进,我想记录我是如何让Mvx.Resolve<IMvxFileDownloadCache>()工作的。在我的setup.cs中(在触摸项目中),我有:

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();
    ...
}

但这还不够,因为实际上没有任何内容在DownloadCache插件中注册IMvxFileDownloadCache(我原以为是这样,但事实并非如此)。

然后我尝试在这里添加这一行:

Mvx.LazyConstructAndRegisterSingleton<IMvxFileDownloadCache, MvxFileDownloadCache>();

但是失败了,因为MvxFileDownloadCache构造函数需要一些参数。所以我最终得到了这个:

protected override void InitializeLastChance ()
{

    ...

    var configuration = MvxDownloadCacheConfiguration.Default;

    var fileDownloadCache = new MvxFileDownloadCache(
        configuration.CacheName,
        configuration.CacheFolderPath,
        configuration.MaxFiles,
        configuration.MaxFileAge);

    Mvx.RegisterSingleton<IMvxFileDownloadCache>(fileDownloadCache);

    ...
}

现在解决方案还可行。

<强>问题: 我确实想知道如果两个以完全相同的方式配置的MvxFileDownloadCache对象通过相互踩踏会导致问题会发生什么。我可以通过手动修改我正在构建的缓存名称来避免这个问题,但我确实希望它是一个缓存(资产将是相同的)。

答案 1 :(得分:1)

如果您查看插件的来源,您会找到https://github.com/MvvmCross/MvvmCross/blob/3.2/Plugins/Cirrious/DownloadCache/Cirrious.MvvmCross.Plugins.DownloadCache/IMvxFileDownloadCache.cs - 这将为您提供缓存文件的本地文件路径:

public interface IMvxFileDownloadCache 
{ 
     void RequestLocalFilePath(string httpSource, Action<string> success, Action<Exception> error); 
} 

您可以使用Mvx.Resolve<IMvxFileDownloadCache>()

获取实现此界面的服务

要将其转换为系统范围的文件路径,请在https://github.com/MvvmCross/MvvmCross/blob/3.2/Plugins/Cirrious/File/Cirrious.MvvmCross.Plugins.File/IMvxFileStore.cs#L27

中尝试NativePath