1616#import < MobileCoreServices/MobileCoreServices.h>
1717#endif
1818
19- @interface LPMetadataProvider (SDWebImageOperation) <SDWebImageOperation>
19+ @interface SDImageLinkLoaderOperation : NSObject <SDWebImageOperation>
20+
21+ @property (nonatomic , strong ) LPMetadataProvider *provider;
22+ @property (nonatomic , getter =isCancelled) BOOL cancelled;
23+
24+ @end
25+
26+ @implementation SDImageLinkLoaderOperation
27+
28+ - (void )cancel {
29+ [self .provider cancel ];
30+ self.cancelled = YES ;
31+ }
2032
2133@end
2234
@@ -61,11 +73,11 @@ - (BOOL)canRequestImageForURL:(NSURL *)url {
6173}
6274
6375- (id <SDWebImageOperation>)requestImageWithURL : (NSURL *)url options : (SDWebImageOptions)options context : (SDWebImageContext *)context progress : (SDImageLoaderProgressBlock)progressBlock completed : (SDImageLoaderCompletedBlock)completedBlock {
76+ SDImageLinkLoaderOperation *operation = [SDImageLinkLoaderOperation new ];
6477 // Let's check wether input URL already have an associated LPLinkMetadata
6578 LPLinkMetadata *metadata = url.sd_linkMetadata ;
6679 if (metadata) {
67- [self fetchImageWithMetadata: metadata options: options context: context progress: progressBlock completed: completedBlock];
68- return nil ;
80+ [self fetchImageWithMetadata: metadata operation: operation options: options context: context progress: progressBlock completed: completedBlock];
6981 } else {
7082 LPMetadataProvider *provider = [[LPMetadataProvider alloc ] init ];
7183 provider.timeout = self.timeout ;
@@ -79,13 +91,15 @@ - (BOOL)canRequestImageForURL:(NSURL *)url {
7991 }
8092 // Associated the link metadata to URL, weak reference
8193 url.sd_linkMetadata = metadata;
82- [self fetchImageWithMetadata: metadata options: options context: context progress: progressBlock completed: completedBlock];
94+ [self fetchImageWithMetadata: metadata operation: operation options: options context: context progress: progressBlock completed: completedBlock];
8395 }];
84- return provider;
96+ operation. provider = provider;
8597 }
98+
99+ return operation;
86100}
87101
88- - (void )fetchImageWithMetadata : (LPLinkMetadata *)metadata options : (SDWebImageOptions)options context : (SDWebImageContext *)context progress : (SDImageLoaderProgressBlock)progressBlock completed : (SDImageLoaderCompletedBlock)completedBlock {
102+ - (void )fetchImageWithMetadata : (LPLinkMetadata *)metadata operation : (SDImageLinkLoaderOperation *) operation options : (SDWebImageOptions)options context : (SDWebImageContext *)context progress : (SDImageLoaderProgressBlock)progressBlock completed : (SDImageLoaderCompletedBlock)completedBlock {
89103 NSURL *url = metadata.originalURL ;
90104 // Parse context option
91105 BOOL requestData = [context[SDWebImageContextLinkRequestImageData] boolValue ];
@@ -108,15 +122,15 @@ - (void)fetchImageWithMetadata:(LPLinkMetadata *)metadata options:(SDWebImageOpt
108122 }
109123 if (requestData) {
110124 // Request the image data and decode
111- [self fetchImageDataWithProvider: imageProvider url: url options: options context: context progress: progressBlock completed: completedBlock];
125+ [self fetchImageDataWithProvider: imageProvider operation: operation url: url options: options context: context progress: progressBlock completed: completedBlock];
112126 } else {
113127 // Only request the image object, faster
114- [self fetchImageWithProvider: imageProvider url: url progress: progressBlock completed: completedBlock];
128+ [self fetchImageWithProvider: imageProvider operation: operation url: url progress: progressBlock completed: completedBlock];
115129 }
116130}
117131
118132// Fetch image and data with `loadDataRepresentationForTypeIdentifier` API
119- - (void )fetchImageDataWithProvider : (NSItemProvider *)imageProvider url : (NSURL *)url options : (SDWebImageOptions)options context : (SDWebImageContext *)context progress : (SDImageLoaderProgressBlock)progressBlock completed : (SDImageLoaderCompletedBlock)completedBlock {
133+ - (void )fetchImageDataWithProvider : (NSItemProvider *)imageProvider operation : (SDImageLinkLoaderOperation *) operation url : (NSURL *)url options : (SDWebImageOptions)options context : (SDWebImageContext *)context progress : (SDImageLoaderProgressBlock)progressBlock completed : (SDImageLoaderCompletedBlock)completedBlock {
120134 SDImageLinkLoaderContext *loaderContext = [SDImageLinkLoaderContext new ];
121135 loaderContext.url = url;
122136 loaderContext.progressBlock = progressBlock;
@@ -125,6 +139,10 @@ - (void)fetchImageDataWithProvider:(NSItemProvider *)imageProvider url:(NSURL *)
125139 if (progressBlock && progress) {
126140 [progress removeObserver: self forKeyPath: NSStringFromSelector (@selector (fractionCompleted )) context: (__bridge void *)(loaderContext)];
127141 }
142+ if (operation.isCancelled ) {
143+ // Cancelled
144+ error = [NSError errorWithDomain: NSURLErrorDomain code: NSURLErrorCancelled userInfo: nil ];
145+ }
128146 if (error) {
129147 if (completedBlock) {
130148 dispatch_main_async_safe (^{
@@ -151,7 +169,7 @@ - (void)fetchImageDataWithProvider:(NSItemProvider *)imageProvider url:(NSURL *)
151169}
152170
153171// Fetch image with `loadObjectOfClass` API
154- - (void )fetchImageWithProvider : (NSItemProvider *)imageProvider url : (NSURL *)url progress : (SDImageLoaderProgressBlock)progressBlock completed : (SDImageLoaderCompletedBlock)completedBlock {
172+ - (void )fetchImageWithProvider : (NSItemProvider *)imageProvider operation : (SDImageLinkLoaderOperation *) operation url : (NSURL *)url progress : (SDImageLoaderProgressBlock)progressBlock completed : (SDImageLoaderCompletedBlock)completedBlock {
155173 SDImageLinkLoaderContext *loaderContext = [SDImageLinkLoaderContext new ];
156174 loaderContext.url = url;
157175 loaderContext.progressBlock = progressBlock;
@@ -160,6 +178,10 @@ - (void)fetchImageWithProvider:(NSItemProvider *)imageProvider url:(NSURL *)url
160178 if (progressBlock && progress) {
161179 [progress removeObserver: self forKeyPath: NSStringFromSelector (@selector (fractionCompleted )) context: (__bridge void *)(loaderContext)];
162180 }
181+ if (operation.isCancelled ) {
182+ // Cancelled
183+ error = [NSError errorWithDomain: NSURLErrorDomain code: NSURLErrorCancelled userInfo: nil ];
184+ }
163185 if (error) {
164186 if (completedBlock) {
165187 dispatch_main_async_safe (^{
0 commit comments