TwitterImagePipeline/TIPImageFetchRequest.m (184 lines of code) (raw):
//
// TIPImageFetchRequest.m
// TwitterImagePipeline
//
// Created on 1/21/16.
// Copyright © 2020 Twitter. All rights reserved.
//
#import "TIPImageFetchRequest.h"
NS_ASSUME_NONNULL_BEGIN
@implementation TIPGenericImageFetchRequest
{
@protected
NSURL *_imageURL;
NSString *_imageIdentifier;
CGSize _targetDimensions;
UIViewContentMode _targetContentMode;
NSTimeInterval _timeToLive;
TIPImageFetchOptions _options;
NSDictionary<NSString *, id<TIPImageFetchProgressiveLoadingPolicy>> *_progressiveLoadingPolicies;
id<TIPImageFetchTransformer> _transformer;
TIPImageFetchLoadingSources _loadingSources;
TIPImageFetchHydrationBlock _imageRequestHydrationBlock;
TIPImageFetchAuthorizationBlock _imageRequestAuthorizationBlock;
NSDictionary<NSString *, id> *_decoderConfigMap;
}
@synthesize imageURL = _imageURL;
@synthesize imageIdentifier = _imageIdentifier;
@synthesize targetDimensions = _targetDimensions;
@synthesize targetContentMode = _targetContentMode;
@synthesize timeToLive = _timeToLive;
@synthesize options = _options;
@synthesize progressiveLoadingPolicies = _progressiveLoadingPolicies;
@synthesize transformer = _transformer;
@synthesize loadingSources = _loadingSources;
@synthesize imageRequestHydrationBlock = _imageRequestHydrationBlock;
@synthesize imageRequestAuthorizationBlock = _imageRequestAuthorizationBlock;
@synthesize decoderConfigMap = _decoderConfigMap;
+ (instancetype)genericImageFetchRequestWithRequest:(id<TIPImageFetchRequest>)request
{
TIPGenericImageFetchRequest *genericRequest = [[[self class] alloc] initWithImageURL:request.imageURL];
#define COPY_PROP(prop) \
if ([request respondsToSelector:@selector( prop )]) { \
genericRequest->_##prop = [request. prop copy]; \
}
#define GET_PROP(prop) \
if ([request respondsToSelector:@selector( prop )]) { \
genericRequest->_##prop = request. prop ; \
}
COPY_PROP(imageIdentifier);
GET_PROP(targetDimensions);
GET_PROP(targetContentMode);
GET_PROP(timeToLive);
GET_PROP(options);
COPY_PROP(progressiveLoadingPolicies);
GET_PROP(transformer);
GET_PROP(loadingSources);
COPY_PROP(imageRequestHydrationBlock);
COPY_PROP(imageRequestAuthorizationBlock);
COPY_PROP(decoderConfigMap);
#undef COPY_PROP
#undef GET_PROP
return genericRequest;
}
- (instancetype)initWithImageURL:(NSURL *)imageURL
{
return [self initWithImageURL:imageURL identifier:nil targetDimensions:CGSizeZero targetContentMode:UIViewContentModeCenter];
}
- (instancetype)initWithImageURL:(NSURL *)imageURL
identifier:(nullable NSString *)imageIdentifier
targetDimensions:(CGSize)dims
targetContentMode:(UIViewContentMode)mode
{
if (self = [super init]) {
_imageURL = imageURL;
_imageIdentifier = [imageIdentifier copy];
_targetDimensions = dims;
_targetContentMode = mode;
_timeToLive = TIPTimeToLiveDefault;
_options = TIPImageFetchNoOptions;
_loadingSources = TIPImageFetchLoadingSourcesAll;
}
return self;
}
- (id)copy
{
return [self copyWithZone:nil];
}
- (id)copyWithZone:(nullable NSZone *)zone
{
return self;
}
- (id)mutableCopy
{
return [self mutableCopyWithZone:nil];
}
- (id)mutableCopyWithZone:(nullable NSZone *)zone
{
TIPMutableGenericImageFetchRequest *request = [[TIPMutableGenericImageFetchRequest allocWithZone:zone] initWithImageURL:self.imageURL];
request.imageIdentifier = self.imageIdentifier;
request.targetDimensions = self.targetDimensions;
request.targetContentMode = self.targetContentMode;
request.timeToLive = self.timeToLive;
request.options = self.options;
request.progressiveLoadingPolicies = self.progressiveLoadingPolicies;
request.transformer = self.transformer;
request.loadingSources = self.loadingSources;
request.imageRequestHydrationBlock = self.imageRequestHydrationBlock;
request.imageRequestAuthorizationBlock = self.imageRequestAuthorizationBlock;
request.decoderConfigMap = self.decoderConfigMap;
return request;
}
@end
@implementation TIPMutableGenericImageFetchRequest
@dynamic imageURL;
@dynamic imageIdentifier;
@dynamic targetDimensions;
@dynamic targetContentMode;
@dynamic timeToLive;
@dynamic options;
@dynamic progressiveLoadingPolicies;
@dynamic transformer;
@dynamic loadingSources;
@dynamic imageRequestHydrationBlock;
@dynamic imageRequestAuthorizationBlock;
@dynamic decoderConfigMap;
- (void)setImageURL:(NSURL *)imageURL
{
_imageURL = imageURL;
}
- (void)setImageIdentifier:(nullable NSString *)imageIdentifier
{
_imageIdentifier = [imageIdentifier copy];
}
- (void)setTargetDimensions:(CGSize)targetDimensions
{
_targetDimensions = targetDimensions;
}
- (void)setTargetContentMode:(UIViewContentMode)targetContentMode
{
_targetContentMode = targetContentMode;
}
- (void)setTimeToLive:(NSTimeInterval)timeToLive
{
_timeToLive = timeToLive;
}
- (void)setOptions:(TIPImageFetchOptions)options
{
_options = options;
}
- (void)setProgressiveLoadingPolicies:(nullable NSDictionary<NSString *,id<TIPImageFetchProgressiveLoadingPolicy>> *)progressiveLoadingPolicies
{
_progressiveLoadingPolicies = [progressiveLoadingPolicies copy];
}
- (void)setTransformer:(nullable id<TIPImageFetchTransformer>)transformer
{
_transformer = transformer;
}
- (void)setLoadingSources:(TIPImageFetchLoadingSources)loadingSources
{
_loadingSources = loadingSources;
}
- (void)setImageRequestHydrationBlock:(nullable TIPImageFetchHydrationBlock)imageRequestHydrationBlock
{
_imageRequestHydrationBlock = [imageRequestHydrationBlock copy];
}
- (void)setImageRequestAuthorizationBlock:(nullable TIPImageFetchAuthorizationBlock)imageRequestAuthorizationBlock
{
_imageRequestAuthorizationBlock = [imageRequestAuthorizationBlock copy];
}
- (void)setDecoderConfigMap:(nullable NSDictionary<NSString *,id> *)decoderConfigMap
{
_decoderConfigMap = [decoderConfigMap copy];
}
- (id)copyWithZone:(nullable NSZone *)zone
{
TIPGenericImageFetchRequest *request = [[TIPGenericImageFetchRequest allocWithZone:zone] initWithImageURL:self.imageURL];
request->_imageIdentifier = [self.imageIdentifier copyWithZone:zone];
request->_targetDimensions = self.targetDimensions;
request->_targetContentMode = self.targetContentMode;
request->_timeToLive = self.timeToLive;
request->_options = self.options;
request->_progressiveLoadingPolicies = self.progressiveLoadingPolicies;
request->_transformer = self.transformer;
request->_loadingSources = self.loadingSources;
request->_imageRequestHydrationBlock = self.imageRequestHydrationBlock;
request->_imageRequestAuthorizationBlock = self.imageRequestAuthorizationBlock;
request->_decoderConfigMap = self.decoderConfigMap;
return request;
}
@end
NS_ASSUME_NONNULL_END