Replace @synchronized lock with dispatch_semaphore lock for SDWebImageCombinedOperation

This commit is contained in:
Lizhen Hu 2018-05-28 23:12:38 +08:00
parent 7dc38751e9
commit 09020fac87
1 changed files with 25 additions and 11 deletions

View File

@ -347,20 +347,34 @@
@end
@interface SDWebImageCombinedOperation ()
@property (strong, nonatomic, nonnull) dispatch_semaphore_t cancelLock; // a lock to make the `cancel` method thread-safe
@end
@implementation SDWebImageCombinedOperation
- (void)cancel {
@synchronized(self) {
self.cancelled = YES;
if (self.cacheOperation) {
[self.cacheOperation cancel];
self.cacheOperation = nil;
}
if (self.downloadToken) {
[self.manager.imageDownloader cancel:self.downloadToken];
}
[self.manager safelyRemoveOperationFromRunning:self];
- (instancetype)init {
self = [super init];
if (self) {
_cancelLock = dispatch_semaphore_create(1);
}
return self;
}
- (void)cancel {
LOCK(self.cancelLock);
self.cancelled = YES;
if (self.cacheOperation) {
[self.cacheOperation cancel];
self.cacheOperation = nil;
}
if (self.downloadToken) {
[self.manager.imageDownloader cancel:self.downloadToken];
}
[self.manager safelyRemoveOperationFromRunning:self];
UNLOCK(self.cancelLock);
}
@end