Files
Texture/Source/ASDefaultImageDownloader.mm
T
Andy Finnell e696302586 Add default image provider (#2127)
* Add default image provider

## Summary

Right now image nodes hardcode logic to use either PINRemoteImage or the basic image downloader. Additionally, Texture is missing annotations for nullability and sendable for several of the image blocks and types.

Introduce ASDefaultImageDownloader as a singleton. It takes blocks to return the default image downloader and image cache. Update both image nodes to use this. By default ASDefaultImageDownloader uses the same logic the image nodes used to, so change in behavior.

## Test plan

Run the Kittens example and verify it works.

* Appears we need Xcode 16.4

* And need at least 18.5
2025-10-22 12:36:55 -04:00

101 lines
2.5 KiB
Plaintext

//
// ASDefaultImageDownloader.m
// Texture
//
// Created by Andrew Finnell on 5/14/25.
// Copyright © 2025 Pinterest. All rights reserved.
//
#import "ASDefaultImageDownloader.h"
#import <AsyncDisplayKit/ASThread.h>
#import <AsyncDisplayKit/ASBasicImageDownloader.h>
#if AS_PIN_REMOTE_IMAGE
#import <AsyncDisplayKit/ASPINRemoteImageDownloader.h>
#endif
using AS::MutexLocker;
@interface ASDefaultImageDownloader () {
AS::Mutex *_lock;
ASImageDownloaderProvider _downloaderProvider;
ASImageCacheProvider _cacheProvider;
}
+ (instancetype)sharedInstance;
@end
@implementation ASDefaultImageDownloader
- (instancetype)init
{
self = [super init];
if (self != nil) {
_lock = new AS::Mutex();
_downloaderProvider = ^id<ASImageDownloaderProtocol>(void) {
#if AS_PIN_REMOTE_IMAGE
return [ASPINRemoteImageDownloader sharedDownloader];
#else
return [ASBasicImageDownloader sharedImageDownloader];
#endif
};
_cacheProvider = ^id<ASImageCacheProtocol>(void) {
#if AS_PIN_REMOTE_IMAGE
return [ASPINRemoteImageDownloader sharedDownloader];
#else
return nil;
#endif
};
}
return self;
}
+ (instancetype)sharedInstance;
{
static dispatch_once_t onceToken;
static ASDefaultImageDownloader *sharedInstance = nil;
dispatch_once(&onceToken, ^{
sharedInstance = [[ASDefaultImageDownloader alloc] init];
});
return sharedInstance;
}
- (nullable id<ASImageDownloaderProtocol>)defaultDownloader
{
MutexLocker l(*self->_lock);
return self->_downloaderProvider();
}
- (nullable id<ASImageCacheProtocol>)defaultCache
{
MutexLocker l(*self->_lock);
return self->_cacheProvider();
}
- (void)setDefaultDownloaderProvider:(ASImageDownloaderProvider _Nonnull)downloaderProvider
cacheProvider:(ASImageCacheProvider _Nonnull)cacheProvider
{
MutexLocker l(*self->_lock);
_downloaderProvider = [downloaderProvider copy];
_cacheProvider = [cacheProvider copy];
}
+ (nullable id<ASImageDownloaderProtocol>)defaultDownloader
{
return [[ASDefaultImageDownloader sharedInstance] defaultDownloader];
}
+ (nullable id<ASImageCacheProtocol>)defaultCache
{
return [[ASDefaultImageDownloader sharedInstance] defaultCache];
}
+ (void)setDefaultDownloaderProvider:(ASImageDownloaderProvider _Nonnull)downloaderProvider
cacheProvider:(ASImageCacheProvider _Nonnull)cacheProvider
{
[[ASDefaultImageDownloader sharedInstance] setDefaultDownloaderProvider:downloaderProvider
cacheProvider:cacheProvider];
}
@end