WatchOS:SDWebImageLottieCoder 在手表应用 运行 时加载新动画

WatchOS: SDWebImageLottieCoder load new animation while watch app is running

我正在关注 WatchOS 上的 this tutorial to use Lottie 动画库。它一直有效,直到我尝试在应用 运行ning 期间更改动画。即使我更改了它,动画仍然保持不变,直到我 运行 来自 Xcode 的手表应用程序。 (如果我只是关闭应用程序并再次打开它不会改变。) 我尝试了什么:

你是对的,缓存导致了你的问题。但是,你还不够深入。

您使用SDWebImageLottieCoder to display your animations, which in turn uses rlottie.

根据他们的自述文件: "rlottie 是一个独立于平台的独立 C++ 库,用于实时渲染基于矢量的动画和艺术。"

关键是动画被rlottie框架缓存了,所以清除URLCacheSDImageCache都不能解决这个问题。

解决此问题的最简单方法是修改 rlottie C++ 库中的代码。在您的 Xcode 项目中导航至 Pods -> Pods -> librlottie 并查找以下文件:lottieanimation_capi.cpp

在此文件中搜索以下代码:

RLOTTIE_API Lottie_Animation_S *lottie_animation_from_data(const char *data, const char *key, const char *resourcePath)
{
    if (auto animation = Animation::loadFromData(data, key, resourcePath) ) {
        Lottie_Animation_S *handle = new Lottie_Animation_S();
        handle->mAnimation = std::move(animation);
        return handle;
    } else {
        return nullptr;
    }
}

这是在您的设备上加载 Lottie 动画并负责缓存的代码。 loadFromData 还有一个名为 cachePolicy 的第四个参数,它是一个布尔值,在这种情况下不会为它传递任何内容。

因此,如果您不想缓存动画,请将 false 传递到此调用中。 将代码修改为这个,它应该可以工作:

RLOTTIE_API Lottie_Animation_S *lottie_animation_from_data(const char *data, const char *key, const char *resourcePath)
{
    if (auto animation = Animation::loadFromData(data, key, resourcePath, false) ) {
        Lottie_Animation_S *handle = new Lottie_Animation_S();
        handle->mAnimation = std::move(animation);
        return handle;
    } else {
        return nullptr;
    }
}