Fix the case when SDAnimatedImageView dealloc on the fetch queue, will cause it trigger the UIKit/AppKit method on non-main queue and captured by UI Main Thread Checker

This commit is contained in:
DreamPiggy 2019-09-03 16:38:14 +08:00
parent 491fefdd48
commit 7bd12dac54
1 changed files with 9 additions and 0 deletions

View File

@ -683,7 +683,12 @@ static NSUInteger SDDeviceFreeMemory() {
if (!fetchFrame && !bufferFull && self.fetchQueue.operationCount == 0) {
// Prefetch next frame in background queue
UIImage<SDAnimatedImage> *animatedImage = self.animatedImage;
@weakify(self);
NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
@strongify(self);
if (!self) {
return;
}
UIImage *frame = [animatedImage animatedImageFrameAtIndex:fetchFrameIndex];
BOOL isAnimating = NO;
@ -697,6 +702,10 @@ static NSUInteger SDDeviceFreeMemory() {
self.frameBuffer[@(fetchFrameIndex)] = frame;
SD_UNLOCK(self.lock);
}
// Ensure when self dealloc, it dealloced on the main queue (UIKit/AppKit rule)
dispatch_async(dispatch_get_main_queue(), ^{
[self class];
});
}];
[self.fetchQueue addOperation:operation];
}