WatchOS:SDWebImageLottieCoder 在手表应用 运行 时加载新动画
WatchOS: SDWebImageLottieCoder load new animation while watch app is running
我正在关注 WatchOS 上的 this tutorial to use Lottie 动画库。它一直有效,直到我尝试在应用 运行ning 期间更改动画。即使我更改了它,动画仍然保持不变,直到我 运行 来自 Xcode 的手表应用程序。 (如果我只是关闭应用程序并再次打开它不会改变。)
我尝试了什么:
- 正在清除监视文件系统的缓存
- 清算
URLCache
- 清除
SDImageCache
内存和磁盘
你是对的,缓存导致了你的问题。但是,你还不够深入。
您使用SDWebImageLottieCoder to display your animations, which in turn uses rlottie.
根据他们的自述文件:
"rlottie 是一个独立于平台的独立 C++ 库,用于实时渲染基于矢量的动画和艺术。"
关键是动画被rlottie框架缓存了,所以清除URLCache
和SDImageCache
都不能解决这个问题。
解决此问题的最简单方法是修改 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;
}
}
我正在关注 WatchOS 上的 this tutorial to use Lottie 动画库。它一直有效,直到我尝试在应用 运行ning 期间更改动画。即使我更改了它,动画仍然保持不变,直到我 运行 来自 Xcode 的手表应用程序。 (如果我只是关闭应用程序并再次打开它不会改变。) 我尝试了什么:
- 正在清除监视文件系统的缓存
- 清算
URLCache
- 清除
SDImageCache
内存和磁盘
你是对的,缓存导致了你的问题。但是,你还不够深入。
您使用SDWebImageLottieCoder to display your animations, which in turn uses rlottie.
根据他们的自述文件: "rlottie 是一个独立于平台的独立 C++ 库,用于实时渲染基于矢量的动画和艺术。"
关键是动画被rlottie框架缓存了,所以清除URLCache
和SDImageCache
都不能解决这个问题。
解决此问题的最简单方法是修改 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;
}
}