diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index bbb554c1..3e2fefd6 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -112,6 +112,8 @@ 327054D6206CD8B3006EA328 /* SDImageAPNGCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 327054D2206CD8B3006EA328 /* SDImageAPNGCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 327054DA206CD8B3006EA328 /* SDImageAPNGCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 327054D3206CD8B3006EA328 /* SDImageAPNGCoder.m */; }; 327054DC206CD8B3006EA328 /* SDImageAPNGCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 327054D3206CD8B3006EA328 /* SDImageAPNGCoder.m */; }; + 327F2E83245AE1650075F846 /* SDWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 327F2E82245AE1650075F846 /* SDWebImageOperation.m */; }; + 327F2E84245AE1650075F846 /* SDWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 327F2E82245AE1650075F846 /* SDWebImageOperation.m */; }; 328BB69E2081FED200760D6C /* SDWebImageCacheKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 328BB69A2081FED200760D6C /* SDWebImageCacheKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 328BB6A22081FED200760D6C /* SDWebImageCacheKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 328BB69B2081FED200760D6C /* SDWebImageCacheKeyFilter.m */; }; 328BB6A42081FED200760D6C /* SDWebImageCacheKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 328BB69B2081FED200760D6C /* SDWebImageCacheKeyFilter.m */; }; @@ -437,6 +439,7 @@ 326E2F32236F1D58006F847F /* SDDeviceHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDDeviceHelper.m; sourceTree = ""; }; 327054D2206CD8B3006EA328 /* SDImageAPNGCoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDImageAPNGCoder.h; path = Core/SDImageAPNGCoder.h; sourceTree = ""; }; 327054D3206CD8B3006EA328 /* SDImageAPNGCoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDImageAPNGCoder.m; path = Core/SDImageAPNGCoder.m; sourceTree = ""; }; + 327F2E82245AE1650075F846 /* SDWebImageOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOperation.m; path = Core/SDWebImageOperation.m; sourceTree = ""; }; 328BB69A2081FED200760D6C /* SDWebImageCacheKeyFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheKeyFilter.h; path = Core/SDWebImageCacheKeyFilter.h; sourceTree = ""; }; 328BB69B2081FED200760D6C /* SDWebImageCacheKeyFilter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheKeyFilter.m; path = Core/SDWebImageCacheKeyFilter.m; sourceTree = ""; }; 328BB6A82081FEE500760D6C /* SDWebImageCacheSerializer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheSerializer.h; path = Core/SDWebImageCacheSerializer.h; sourceTree = ""; }; @@ -846,6 +849,7 @@ 320CAE132086F50500CFFC80 /* SDWebImageError.h */, 320CAE142086F50500CFFC80 /* SDWebImageError.m */, 530E49E71646388E002868E7 /* SDWebImageOperation.h */, + 327F2E82245AE1650075F846 /* SDWebImageOperation.m */, 324DF4B2200A14DC008A84CC /* SDWebImageDefine.h */, 324DF4B3200A14DC008A84CC /* SDWebImageDefine.m */, 325312C6200F09910046BF1E /* SDWebImageTransition.h */, @@ -1196,6 +1200,7 @@ 4A2CAE201AB4BB6C00B6BC39 /* SDImageCache.m in Sources */, 4369C2801D9807EC007E863A /* UIView+WebCache.m in Sources */, 329A18611FFF5DFD008C9A2F /* UIImage+Metadata.m in Sources */, + 327F2E84245AE1650075F846 /* SDWebImageOperation.m in Sources */, 328BB6B22081FEE500760D6C /* SDWebImageCacheSerializer.m in Sources */, 325C4611223394D8004CAE11 /* SDImageCachesManagerOperation.m in Sources */, ); @@ -1270,6 +1275,7 @@ ABBE71A818C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m in Sources */, 4369C27E1D9807EC007E863A /* UIView+WebCache.m in Sources */, 329A185F1FFF5DFD008C9A2F /* UIImage+Metadata.m in Sources */, + 327F2E83245AE1650075F846 /* SDWebImageOperation.m in Sources */, 328BB6B02081FEE500760D6C /* SDWebImageCacheSerializer.m in Sources */, 325C4610223394D8004CAE11 /* SDImageCachesManagerOperation.m in Sources */, ); diff --git a/SDWebImage/Core/SDWebImageOperation.m b/SDWebImage/Core/SDWebImageOperation.m new file mode 100644 index 00000000..0d6e880d --- /dev/null +++ b/SDWebImage/Core/SDWebImageOperation.m @@ -0,0 +1,14 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageOperation.h" + +/// NSOperation conform to `SDWebImageOperation`. +@implementation NSOperation (SDWebImageOperation) + +@end diff --git a/SDWebImage/Core/SDWebImagePrefetcher.m b/SDWebImage/Core/SDWebImagePrefetcher.m index efcb5c73..30b65ace 100644 --- a/SDWebImage/Core/SDWebImagePrefetcher.m +++ b/SDWebImage/Core/SDWebImagePrefetcher.m @@ -266,16 +266,18 @@ @synchronized (self) { [self.prefetchOperations compact]; for (id operation in self.prefetchOperations) { - if ([operation conformsToProtocol:@protocol(SDWebImageOperation)]) { - [operation cancel]; + id strongOperation = operation; + if (strongOperation) { + [strongOperation cancel]; } } self.prefetchOperations.count = 0; [self.loadOperations compact]; for (id operation in self.loadOperations) { - if ([operation conformsToProtocol:@protocol(SDWebImageOperation)]) { - [operation cancel]; + id strongOperation = operation; + if (strongOperation) { + [strongOperation cancel]; } } self.loadOperations.count = 0; diff --git a/SDWebImage/Private/SDAsyncBlockOperation.m b/SDWebImage/Private/SDAsyncBlockOperation.m index 8862ef8e..4aefb4f5 100644 --- a/SDWebImage/Private/SDAsyncBlockOperation.m +++ b/SDWebImage/Private/SDAsyncBlockOperation.m @@ -52,7 +52,9 @@ - (void)cancel { [super cancel]; - [self complete]; + if (self.isExecuting) { + [self complete]; + } } - (void)complete {