Giter VIP home page Giter VIP logo

Comments (9)

dreampiggy avatar dreampiggy commented on June 15, 2024

By designed issue.

The SDAnimatedImage and _UIAnimatedImage is not compatible.

If you use normal UIImageView to display GIF, which is indeed a bad idea. You can disable this by using the options override.

if context[.animatedImageClass] != SDAnimatedImgae.class {
    context.options |= .decodeFirstFrameOnly
}

from sdwebimage.

pepsikirk avatar pepsikirk commented on June 15, 2024

By designed issue.

The SDAnimatedImage and _UIAnimatedImage is not compatible.

If you use normal UIImageView to display GIF, which is indeed a bad idea. You can disable this by using the options override.

if context[.animatedImageClass] != SDAnimatedImgae.class {
    context.options |= .decodeFirstFrameOnly
}

This is indeed not a good idea, but we do have such a business scenario, mainly occurring when displaying network avatars.
I noticed that the solution you provided is to use a static image display, while my expectation is to enable UIImageView to play the animated image dynamically, rather than just displaying the first frame.
Currently, does SDWebImage not support this scenario?

from sdwebimage.

dreampiggy avatar dreampiggy commented on June 15, 2024

UIImageView is from Apple's UIKit, we can not change it's behavior or hook them

_UIAnimatedImage is the only API to make the UIImageView play animation. And, it's use CoreAnimation layer animation to replace each frame.

It can not supports to dynamic replacement himself.

Read more about why we introduce SDAnimatedImageView/SDAnimatedImage and subclass UIImageView/UIImage
https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#animated-image-50

from sdwebimage.

dreampiggy avatar dreampiggy commented on June 15, 2024

I guess your question is:

Since SDAnimatedImage here contains a frame buffer pool, when I create another UIImage for the same image (means, the Data), can we steal the frame from it ?

Maybe, but this cause huge complicated.

If I really really has two image view, one is UIImageView, another is SDAnimatedImage, and want both of them showing the animation GIF, how can I do ?

Well, you can. Using the option SDWebImageMatchAnimatedImageClass. See why I introduce that option
#2801

Pay attention for RAM usage. UIAnimatedImage will always occupy bytesPerFrame * frame count, which means, a 1000*1000 100 frame GIF will occupy 381MB RAM

from sdwebimage.

dreampiggy avatar dreampiggy commented on June 15, 2024

Oh, seems that SDWebImageMatchAnimatedImageClass does not solve this case. It will only ensure:

  1. Cached image is UIImage, but consumer is SDAnimatedImageView. Will assume cache miss and re-decoding

I guess your case seems to be:

  1. Cached image is SDAnimatedImage, but consumer is UIImageView

from sdwebimage.

pepsikirk avatar pepsikirk commented on June 15, 2024

Oh, seems that SDWebImageMatchAnimatedImageClass does not solve this case. It will only ensure:

  1. Cached image is UIImage, but consumer is SDAnimatedImageView. Will assume cache miss and re-decoding

I guess your case seems to be:

  1. Cached image is SDAnimatedImage, but consumer is UIImageView

I understand, but the cost of replacing all UIImageViews that could potentially display animated images with SDAnimatedImageView in our application is somewhat high. Therefore, my current solution involves hooking the cacheKeyForURL:context: method and setting the key through SDWebImageContextAnimatedImageClass for identification. However, this approach is not quite elegant, and it also results in storing three identical copies of the data on the disk. So, I am still in the process of finding a better solution.

from sdwebimage.

dreampiggy avatar dreampiggy commented on June 15, 2024

Need changes about how image stored and queried. A better design is to store both, with a modified key. Or using a more hackey way

A more hackey way can be like. UIImage instance use associated object to retain the SDAnimatedImage, or the reversed.

from sdwebimage.

dreampiggy avatar dreampiggy commented on June 15, 2024

The original design of SDAnimatedImage because I don't think people still preferrs to use _UIAnimatedImage, which has high ratio from the design to cause OOM (which retain a NSArray<UIImage *> in memory, bad thing)

from sdwebimage.

pepsikirk avatar pepsikirk commented on June 15, 2024

Thank you, I already know what to do.

from sdwebimage.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.