【问题标题】:nativescript image-cache module not working as per examplenativescript 图像缓存模块不按示例工作
【发布时间】:2019-06-03 04:11:32
【问题描述】:

使用 nativescript.org 网站上提供的示例 我创建了一个页面来测试图像缓存组件。 tns-core-modules/ui/image-cache

cache.push() 工作正常。 任何时候我使用 cache.get(url) 对象都会返回 null。我永远无法检索缓存的图像。

在推送完成后,似乎可以从缓存中检索图像,但似乎无法保留。

这发生在模拟器以及实际连接的安卓设备上。

我尝试从头开始创建一个空的地狱世界 JavaScript 应用程序 tns create --template tns-template-hello-world 来测试样本并遇到同样的问题。

    const cache = new Cache();
cache.placeholder = fromFile("~/images/logo.png");
cache.maxRequests = 5;

// set the placeholder while the desired image is donwloaded
viewModel.set("imageSource", cache.placeholder);

// Enable download while not scrolling
cache.enableDownload();

let cachedImageSource;
const url = "https://avatars1.githubusercontent.com/u/7392261?v=4";
// Try to read the image from the cache
const image = cache.get(url);

if (image) {
    // If present -- use it.
    cachedImageSource = imageSource.fromNativeSource(image);
    viewModel.set("imageSource", cachedImageSource);
} else {
    // If not present -- request its download + put it in the cache.
    cache.push({
        key: url,
        url: url,
        completed: (image, key) => {
            if (url === key) {
                cachedImageSource = fromNativeSource(image);
                viewModel.set("imageSource", cachedImageSource); // set the downloaded iamge
            }
        }
    });
}

// Disable download while scrolling
cache.disableDownload();

【问题讨论】:

    标签: image caching nativescript


    【解决方案1】:

    image-cache 模块没有持久存储。此处的图像永远不会写入磁盘,它只是将图像缓存在内存中,仅用于当前会话,一旦您的应用关闭,它将丢失所有下载的图像。

    或者,如果队列达到分配的最大内存(即设备总内存的 1/8),则队列中最旧的图像将被标记为进行垃圾回收。在这种情况下,如果您再次请求图像,则必须再次下载。

    如果我理解正确,您希望将图像缓存在持久存储上,以便在后续应用启动时无需再次下载。您可以通过使用 Http 模块下载图像并将其写入文件来手动执行此操作。我们也有一些用于相同目的的插件,nativescript-web-image-cachenativescript-image-cache-it 在这里很少提及。

    【讨论】:

    • 感谢您的建议,我能够使用 HTTP 并在本地下载图像,然后使用列表视图通过 src="~/localfiles/filename.png" 显示图像。我遇到的问题是,当图像被更改并使用相同的文件名重新下载时,除非应用程序关闭并重新打开,否则它们不会在应用程序中刷新。有没有办法强制刷新图片或清除缓存?
    • 只需将图像 src 设置为 null 并将其设置回新的/相同的路径。
    • 这不起作用。它闪烁 null 然后显示图像的缓存版本。 for (let i = 0; i
    • 抱歉,不能用 Playground 示例来重现该问题。
    【解决方案2】:

    正如 Manoj 所说,图像缓存在内存缓存中,预计在初始加载时会收到 null。但是,一旦图像被加载,您应该能够毫不费力地检索它。

    为了您的方便,我提取了cutness.io 测试应用here。在应用程序中,image-cache 用于为列表视图中的每个项目加载带有占位符的缩略图。您可以在这一行看到cache.get 将在初始加载时返回null,但在您向下和向上滚动列表项后,顺序加载将返回对本机图像的引用(see this line)。请注意,我们没有关闭应用程序,并且在视图模型中使用图像缓存来加载 thumbnail 属性 - 在 ListView 控件的上下文中,这意味着每次渲染单元格时都会触发 getter(上下滚动触发回收和渲染单元格,这将触发绑定)。

    【讨论】:

    • 不幸的是,即使用户在关闭后返回应用程序,我也需要保留图像。有没有将图像从 url 保存到文件系统的方法?然后我可以在本地引用 src,我根本不需要使用缓存。
    • 图像缓存不是批量保存。您将需要另一个插件或不同的方法(例如,通过文件系统保存图像,如果图像已经从本地存储中可用,则对连续加载创建显式检查)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2017-11-15
    • 2016-06-13
    • 2011-05-09
    • 2018-11-18
    • 2021-05-19
    相关资源
    最近更新 更多