Просмотр исходного кода

Merge pull request #2903 from dreampiggy/fix_thread_safe_datatask

Fix the thread safe issue with Downloader and DownloaderOperation during cancel
DreamPiggy 6 лет назад
Родитель
Сommit
421ed8fa8a
2 измененных файлов с 6 добавлено и 2 удалено
  1. 0 1
      SDWebImage/Core/SDWebImageDefine.m
  2. 6 1
      SDWebImage/Core/SDWebImageDownloader.m

+ 0 - 1
SDWebImage/Core/SDWebImageDefine.m

@@ -9,7 +9,6 @@
 #import "SDWebImageDefine.h"
 #import "UIImage+Metadata.h"
 #import "NSImage+Compatibility.h"
-#import "UIImage+ExtendedCacheData.h"
 #import "SDAssociatedObject.h"
 
 #pragma mark - Image scale

+ 6 - 1
SDWebImage/Core/SDWebImageDownloader.m

@@ -403,7 +403,12 @@ static void * SDWebImageDownloaderContext = &SDWebImageDownloaderContext;
     NSOperation<SDWebImageDownloaderOperation> *returnOperation = nil;
     for (NSOperation<SDWebImageDownloaderOperation> *operation in self.downloadQueue.operations) {
         if ([operation respondsToSelector:@selector(dataTask)]) {
-            if (operation.dataTask.taskIdentifier == task.taskIdentifier) {
+            // So we lock the operation here, and in `SDWebImageDownloaderOperation`, we use `@synchonzied (self)`, to ensure the thread safe between these two classes.
+            NSURLSessionTask *operationTask;
+            @synchronized (operation) {
+                operationTask = operation.dataTask;
+            }
+            if (operationTask.taskIdentifier == task.taskIdentifier) {
                 returnOperation = operation;
                 break;
             }