Skip to content

Commit

Permalink
Merge pull request #2099 from yeatse/feature/recreate-from-processor
Browse files Browse the repository at this point in the history
fix: always use specified processors to recreate animated image representation
  • Loading branch information
onevcat authored Jun 19, 2023
2 parents 3f6992b + 4fb16b2 commit 19aa15d
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 2 deletions.
2 changes: 1 addition & 1 deletion Sources/General/KingfisherManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,7 @@ public class KingfisherManager {
if image.kf.imageFrameCount != nil && image.kf.imageFrameCount != 1, let data = image.kf.animatedImageData {
// Always recreate animated image representation since it is possible to be loaded in different options.
// https://github.com/onevcat/Kingfisher/issues/1923
image = KingfisherWrapper.animatedImage(data: data, options: options.imageCreatingOptions) ?? .init()
image = options.processor.process(item: .data(data), options: options) ?? .init()
}
if let modifier = options.imageModifier {
image = modifier.modify(image)
Expand Down
34 changes: 33 additions & 1 deletion Tests/KingfisherTests/KingfisherManagerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1186,6 +1186,35 @@ class KingfisherManagerTests: XCTestCase {

waitForExpectations(timeout: 3, handler: nil)
}

// https://github.com/onevcat/Kingfisher/issues/1923
func testAnimatedImageShouldRecreateFromCache() {
let exp = expectation(description: #function)
let url = testURLs[0]
let data = testImageGIFData
stub(url, data: data)
let p = SimpleProcessor()
manager.retrieveImage(with: url, options: [.processor(p), .onlyLoadFirstFrame]) { result in
XCTAssertTrue(p.processed)
XCTAssertTrue(result.value!.image.creatingOptions!.onlyFirstFrame)
p.processed = false
self.manager.retrieveImage(with: url, options: [.processor(p)]) { result in
XCTAssertTrue(p.processed)
XCTAssertFalse(result.value!.image.creatingOptions!.onlyFirstFrame)
exp.fulfill()
}
}
waitForExpectations(timeout: 3, handler: nil)
}
}

private var imageCreatingOptionsKey: Void?

extension KFCrossPlatformImage {
var creatingOptions: ImageCreatingOptions? {
get { return getAssociatedObject(self, &imageCreatingOptionsKey) }
set { setRetainedAssociatedObject(self, &imageCreatingOptionsKey, newValue) }
}
}

class SimpleProcessor: ImageProcessor {
Expand All @@ -1208,7 +1237,10 @@ class SimpleProcessor: ImageProcessor {
case .image(let image):
return image
case .data(let data):
return KingfisherWrapper<KFCrossPlatformImage>.image(data: data, options: options.imageCreatingOptions)
let creatingOptions = options.imageCreatingOptions
let image = KingfisherWrapper<KFCrossPlatformImage>.image(data: data, options: creatingOptions)
image?.creatingOptions = creatingOptions
return image
}
}
}
Expand Down

0 comments on commit 19aa15d

Please sign in to comment.