From bccdd2a76609058a31ab11e91579d56e9675922d Mon Sep 17 00:00:00 2001 From: DreamPiggy Date: Fri, 26 Jan 2018 14:28:50 +0800 Subject: [PATCH] Add the current image/alternateImage url for NSButton category. A little code refactoring --- SDWebImage/NSButton+WebCache.h | 10 +++++++++ SDWebImage/NSButton+WebCache.m | 39 +++++++++++++++++++++++++++++---- SDWebImage/UIButton+WebCache.m | 40 +++++++++++++++++++++------------- 3 files changed, 70 insertions(+), 19 deletions(-) diff --git a/SDWebImage/NSButton+WebCache.h b/SDWebImage/NSButton+WebCache.h index 42c3fc69..57f7115e 100644 --- a/SDWebImage/NSButton+WebCache.h +++ b/SDWebImage/NSButton+WebCache.h @@ -16,6 +16,11 @@ #pragma mark - Image +/** + * Get the current image URL. + */ +- (nullable NSURL *)sd_currentImageURL; + /** * Set the button `image` with an `url`. * @@ -125,6 +130,11 @@ #pragma mark - Alternate Image +/** + * Get the current alternateImage URL. + */ +- (nullable NSURL *)sd_currentAlternateImageURL; + /** * Set the button `alternateImage` with an `url`. * diff --git a/SDWebImage/NSButton+WebCache.m b/SDWebImage/NSButton+WebCache.m index 5a012c36..3ca080f2 100644 --- a/SDWebImage/NSButton+WebCache.m +++ b/SDWebImage/NSButton+WebCache.m @@ -10,9 +10,18 @@ #if SD_MAC +#import "objc/runtime.h" #import "UIView+WebCacheOperation.h" #import "UIView+WebCache.h" +static inline NSString * imageOperationKey() { + return @"NSButtonImageOperation"; +} + +static inline NSString * alternateImageOperationKey() { + return @"NSButtonAlternateImageOperation"; +} + @implementation NSButton (WebCache) #pragma mark - Image @@ -46,11 +55,13 @@ options:(SDWebImageOptions)options progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock { + self.sd_currentImageURL = url; + __weak typeof(self)weakSelf = self; [self sd_internalSetImageWithURL:url placeholderImage:placeholder options:options - operationKey:@"NSButtonImageOperation" + operationKey:imageOperationKey() setImageBlock:^(NSImage * _Nullable image, NSData * _Nullable imageData) { weakSelf.image = image; } @@ -89,11 +100,13 @@ options:(SDWebImageOptions)options progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock { + self.sd_currentAlternateImageURL = url; + __weak typeof(self)weakSelf = self; [self sd_internalSetImageWithURL:url placeholderImage:placeholder options:options - operationKey:@"NSButtonAlternateImageOperation" + operationKey:alternateImageOperationKey() setImageBlock:^(NSImage * _Nullable image, NSData * _Nullable imageData) { weakSelf.alternateImage = image; } @@ -104,11 +117,29 @@ #pragma mark - Cancel - (void)sd_cancelCurrentImageLoad { - [self sd_cancelImageLoadOperationWithKey:@"NSButtonImageOperation"]; + [self sd_cancelImageLoadOperationWithKey:imageOperationKey()]; } - (void)sd_cancelCurrentAlternateImageLoad { - [self sd_cancelImageLoadOperationWithKey:@"NSButtonAlternateImageOperation"]; + [self sd_cancelImageLoadOperationWithKey:alternateImageOperationKey()]; +} + +#pragma mar - Private + +- (NSURL *)sd_currentImageURL { + return objc_getAssociatedObject(self, @selector(sd_currentImageURL)); +} + +- (void)setSd_currentImageURL:(NSURL *)sd_currentImageURL { + objc_setAssociatedObject(self, @selector(sd_currentImageURL), sd_currentImageURL, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (NSURL *)sd_currentAlternateImageURL { + return objc_getAssociatedObject(self, @selector(sd_currentAlternateImageURL)); +} + +- (void)setSd_currentAlternateImageURL:(NSURL *)sd_currentAlternateImageURL { + objc_setAssociatedObject(self, @selector(sd_currentAlternateImageURL), sd_currentAlternateImageURL, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @end diff --git a/SDWebImage/UIButton+WebCache.m b/SDWebImage/UIButton+WebCache.m index 83aebd04..8cdadb67 100644 --- a/SDWebImage/UIButton+WebCache.m +++ b/SDWebImage/UIButton+WebCache.m @@ -26,22 +26,30 @@ static inline NSString * backgroundImageURLKeyForState(UIControlState state) { return [NSString stringWithFormat:@"backgroundImage_%lu", (unsigned long)state]; } +static inline NSString * imageOperationKeyForState(UIControlState state) { + return [NSString stringWithFormat:@"UIButtonImageOperation%lu", (unsigned long)state]; +} + +static inline NSString * backgroundImageOperationKeyForState(UIControlState state) { + return [NSString stringWithFormat:@"UIButtonBackgroundImageOperation%lu", (unsigned long)state]; +} + @implementation UIButton (WebCache) #pragma mark - Image - (nullable NSURL *)sd_currentImageURL { - NSURL *url = self.imageURLStorage[imageURLKeyForState(self.state)]; + NSURL *url = self.sd_imageURLStorage[imageURLKeyForState(self.state)]; if (!url) { - url = self.imageURLStorage[imageURLKeyForState(UIControlStateNormal)]; + url = self.sd_imageURLStorage[imageURLKeyForState(UIControlStateNormal)]; } return url; } - (nullable NSURL *)sd_imageURLForState:(UIControlState)state { - return self.imageURLStorage[imageURLKeyForState(state)]; + return self.sd_imageURLStorage[imageURLKeyForState(state)]; } - (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state { @@ -70,16 +78,16 @@ static inline NSString * backgroundImageURLKeyForState(UIControlState state) { options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { if (!url) { - [self.imageURLStorage removeObjectForKey:imageURLKeyForState(state)]; + [self.sd_imageURLStorage removeObjectForKey:imageURLKeyForState(state)]; } else { - self.imageURLStorage[imageURLKeyForState(state)] = url; + self.sd_imageURLStorage[imageURLKeyForState(state)] = url; } __weak typeof(self)weakSelf = self; [self sd_internalSetImageWithURL:url placeholderImage:placeholder options:options - operationKey:[NSString stringWithFormat:@"UIButtonImageOperation%@", @(state)] + operationKey:imageOperationKeyForState(state) setImageBlock:^(UIImage *image, NSData *imageData) { [weakSelf setImage:image forState:state]; } @@ -90,17 +98,17 @@ static inline NSString * backgroundImageURLKeyForState(UIControlState state) { #pragma mark - Background Image - (nullable NSURL *)sd_currentBackgroundImageURL { - NSURL *url = self.imageURLStorage[backgroundImageURLKeyForState(self.state)]; + NSURL *url = self.sd_imageURLStorage[backgroundImageURLKeyForState(self.state)]; if (!url) { - url = self.imageURLStorage[backgroundImageURLKeyForState(UIControlStateNormal)]; + url = self.sd_imageURLStorage[backgroundImageURLKeyForState(UIControlStateNormal)]; } return url; } - (nullable NSURL *)sd_backgroundImageURLForState:(UIControlState)state { - return self.imageURLStorage[backgroundImageURLKeyForState(state)]; + return self.sd_imageURLStorage[backgroundImageURLKeyForState(state)]; } - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state { @@ -129,16 +137,16 @@ static inline NSString * backgroundImageURLKeyForState(UIControlState state) { options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { if (!url) { - [self.imageURLStorage removeObjectForKey:backgroundImageURLKeyForState(state)]; + [self.sd_imageURLStorage removeObjectForKey:backgroundImageURLKeyForState(state)]; } else { - self.imageURLStorage[backgroundImageURLKeyForState(state)] = url; + self.sd_imageURLStorage[backgroundImageURLKeyForState(state)] = url; } __weak typeof(self)weakSelf = self; [self sd_internalSetImageWithURL:url placeholderImage:placeholder options:options - operationKey:[NSString stringWithFormat:@"UIButtonBackgroundImageOperation%@", @(state)] + operationKey:backgroundImageOperationKeyForState(state) setImageBlock:^(UIImage *image, NSData *imageData) { [weakSelf setBackgroundImage:image forState:state]; } @@ -149,14 +157,16 @@ static inline NSString * backgroundImageURLKeyForState(UIControlState state) { #pragma mark - Cancel - (void)sd_cancelImageLoadForState:(UIControlState)state { - [self sd_cancelImageLoadOperationWithKey:[NSString stringWithFormat:@"UIButtonImageOperation%@", @(state)]]; + [self sd_cancelImageLoadOperationWithKey:imageOperationKeyForState(state)]; } - (void)sd_cancelBackgroundImageLoadForState:(UIControlState)state { - [self sd_cancelImageLoadOperationWithKey:[NSString stringWithFormat:@"UIButtonBackgroundImageOperation%@", @(state)]]; + [self sd_cancelImageLoadOperationWithKey:backgroundImageOperationKeyForState(state)]; } -- (SDStateImageURLDictionary *)imageURLStorage { +#pragma mark - Private + +- (SDStateImageURLDictionary *)sd_imageURLStorage { SDStateImageURLDictionary *storage = objc_getAssociatedObject(self, &imageURLStorageKey); if (!storage) { storage = [NSMutableDictionary dictionary];