YBIBDefaultWebImageMediator.m 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. //
  2. // YBIBDefaultWebImageMediator.m
  3. // YBImageBrowserDemo
  4. //
  5. // Created by 波儿菜 on 2019/8/27.
  6. // Copyright © 2019 杨波. All rights reserved.
  7. //
  8. #import "YBIBDefaultWebImageMediator.h"
  9. #import "YBIBUtilities.h"
  10. #if __has_include(<SDWebImage/SDWebImage.h>)
  11. #import <SDWebImage/SDWebImage.h>
  12. #else
  13. #import "SDWebImageManager.h"
  14. #endif
  15. @implementation YBIBDefaultWebImageMediator
  16. #pragma mark - <YBIBWebImageMediator>
  17. - (id)yb_downloadImageWithURL:(NSURL *)URL requestModifier:(nullable YBIBWebImageRequestModifierBlock)requestModifier progress:(nonnull YBIBWebImageProgressBlock)progress success:(nonnull YBIBWebImageSuccessBlock)success failed:(nonnull YBIBWebImageFailedBlock)failed {
  18. if (!URL) return nil;
  19. SDWebImageDownloaderOptions options = SDWebImageDownloaderUseNSURLCache;
  20. SDWebImageDownloadToken *token = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:URL options:options progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {
  21. if (progress) progress(receivedSize, expectedSize);
  22. } completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
  23. if (error) {
  24. if (failed) failed(error, finished);
  25. } else {
  26. if (success) success(data, finished);
  27. }
  28. }];
  29. return token;
  30. }
  31. - (void)yb_cancelTaskWithDownloadToken:(id)token {
  32. if (token && [token isKindOfClass:SDWebImageDownloadToken.class]) {
  33. [((SDWebImageDownloadToken *)token) cancel];
  34. }
  35. }
  36. - (void)yb_storeToDiskWithImageData:(NSData *)data forKey:(NSURL *)key {
  37. if (!key) return;
  38. NSString *cacheKey = [SDWebImageManager.sharedManager cacheKeyForURL:key];
  39. if (!cacheKey) return;
  40. YBIB_DISPATCH_ASYNC(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
  41. [[SDImageCache sharedImageCache] storeImageDataToDisk:data forKey:cacheKey];
  42. })
  43. }
  44. - (void)yb_queryCacheOperationForKey:(NSURL *)key completed:(YBIBWebImageCacheQueryCompletedBlock)completed {
  45. #define QUERY_CACHE_FAILED if (completed) {completed(nil, nil); return;}
  46. if (!key) QUERY_CACHE_FAILED
  47. NSString *cacheKey = [SDWebImageManager.sharedManager cacheKeyForURL:key];
  48. if (!cacheKey) QUERY_CACHE_FAILED
  49. #undef QUERY_CACHE_FAILED
  50. // 'NSData' of image must be read to ensure decoding correctly.
  51. SDImageCacheOptions options = SDImageCacheQueryDataWhenInMemory | SDImageCacheScaleDownLargeImages;
  52. [[SDImageCache sharedImageCache] queryCacheOperationForKey:cacheKey options:options done:^(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType) {
  53. if (completed) completed(image, data);
  54. }];
  55. }
  56. @end