mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Add task cancellation
This commit is contained in:
parent
ef727ee08e
commit
0608b573f9
@ -10,6 +10,7 @@ public final class DirectAnimatedStickerNode: ASDisplayNode, AnimatedStickerNode
|
|||||||
private static let sharedQueue = Queue(name: "DirectAnimatedStickerNode", qos: .userInteractive)
|
private static let sharedQueue = Queue(name: "DirectAnimatedStickerNode", qos: .userInteractive)
|
||||||
|
|
||||||
private final class LoadFrameTask {
|
private final class LoadFrameTask {
|
||||||
|
var isCancelled: Bool = false
|
||||||
}
|
}
|
||||||
|
|
||||||
public var automaticallyLoadFirstFrame: Bool = false
|
public var automaticallyLoadFirstFrame: Bool = false
|
||||||
@ -129,7 +130,7 @@ public final class DirectAnimatedStickerNode: ASDisplayNode, AnimatedStickerNode
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func startNextFrameTimerIfNeeded() {
|
private func startNextFrameTimerIfNeeded() {
|
||||||
if self.nextFrameTimer == nil, let lottieInstance = self.lottieInstance {
|
if self.nextFrameTimer == nil, let lottieInstance = self.lottieInstance, self.frameImages[self.frameIndex] != nil {
|
||||||
let nextFrameTimer = SwiftSignalKit.Timer(timeout: 1.0 / Double(lottieInstance.frameRate), repeat: false, completion: { [weak self] in
|
let nextFrameTimer = SwiftSignalKit.Timer(timeout: 1.0 / Double(lottieInstance.frameRate), repeat: false, completion: { [weak self] in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
return
|
return
|
||||||
@ -201,6 +202,12 @@ public final class DirectAnimatedStickerNode: ASDisplayNode, AnimatedStickerNode
|
|||||||
self.frameImages.removeValue(forKey: index)
|
self.frameImages.removeValue(forKey: index)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (index, task) in self.loadFrameTasks {
|
||||||
|
if !allowedIndices.contains(index) {
|
||||||
|
task.isCancelled = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let image = self.frameImages[self.frameIndex] {
|
if let image = self.frameImages[self.frameIndex] {
|
||||||
self.layer.contents = image.cgImage
|
self.layer.contents = image.cgImage
|
||||||
|
|
||||||
@ -238,22 +245,29 @@ public final class DirectAnimatedStickerNode: ASDisplayNode, AnimatedStickerNode
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
self.loadFrameTasks[frameIndex] = LoadFrameTask()
|
let task = LoadFrameTask()
|
||||||
|
self.loadFrameTasks[frameIndex] = task
|
||||||
|
|
||||||
DirectAnimatedStickerNode.sharedQueue.async { [weak self] in
|
DirectAnimatedStickerNode.sharedQueue.async { [weak self] in
|
||||||
let drawingContext = DrawingContext(size: playbackSize, scale: 1.0, opaque: false, clear: false)
|
var image: UIImage?
|
||||||
lottieInstance.renderFrame(with: Int32(frameIndex), into: drawingContext.bytes.assumingMemoryBound(to: UInt8.self), width: Int32(drawingContext.scaledSize.width), height: Int32(drawingContext.scaledSize.height), bytesPerRow: Int32(drawingContext.bytesPerRow))
|
|
||||||
|
|
||||||
let image = drawingContext.generateImage()
|
if !task.isCancelled {
|
||||||
|
let drawingContext = DrawingContext(size: playbackSize, scale: 1.0, opaque: false, clear: false)
|
||||||
|
lottieInstance.renderFrame(with: Int32(frameIndex), into: drawingContext.bytes.assumingMemoryBound(to: UInt8.self), width: Int32(drawingContext.scaledSize.width), height: Int32(drawingContext.scaledSize.height), bytesPerRow: Int32(drawingContext.bytesPerRow))
|
||||||
|
|
||||||
|
image = drawingContext.generateImage()
|
||||||
|
}
|
||||||
|
|
||||||
Queue.mainQueue().async {
|
Queue.mainQueue().async {
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
strongSelf.loadFrameTasks.removeValue(forKey: frameIndex)
|
if let currentTask = strongSelf.loadFrameTasks[frameIndex], currentTask === task {
|
||||||
|
strongSelf.loadFrameTasks.removeValue(forKey: frameIndex)
|
||||||
|
}
|
||||||
|
|
||||||
if let image = image {
|
if !task.isCancelled, let image = image {
|
||||||
strongSelf.frameImages[frameIndex] = image
|
strongSelf.frameImages[frameIndex] = image
|
||||||
strongSelf.updateFrameImageIfNeeded()
|
strongSelf.updateFrameImageIfNeeded()
|
||||||
strongSelf.updateLoadFrameTasks()
|
strongSelf.updateLoadFrameTasks()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user