perf(ios): autoreleasepool for image extensions

This commit is contained in:
Nathan Walker
2022-02-16 17:01:34 -08:00
parent 3cf5833423
commit fbefea4dba
9 changed files with 36 additions and 36 deletions

View File

@ -34,7 +34,7 @@
</data>
<key>Info.plist</key>
<data>
WsLLFjQ3sruW6pvEfLRTXorurcg=
xwF1juLfCl48xVJYOqCb8tG0WhQ=
</data>
<key>Modules/module.modulemap</key>
<data>

View File

@ -12,65 +12,65 @@
@implementation UIImage (TNSBlocks)
static dispatch_queue_t image_queue;
static NSLock* image_lock_handle;
+ (void) initialize {
image_queue = dispatch_queue_create("org.nativescript.TNSWidgets.image", NULL);
if ([[NSProcessInfo processInfo] operatingSystemVersion].majorVersion >= 9) {
// UIImage imageNamed: is said to be thread safe, in iOS9 and later, in offical Apple reference.
image_lock_handle = nil;
} else {
image_lock_handle = [NSLock new];
}
}
- (void) tns_forceDecode {
@autoreleasepool {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, 1, 1, 8, 0, colorSpace, kCGImageAlphaPremultipliedFirst);
CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), [self CGImage]);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
}
}
+ (void) tns_safeDecodeImageNamed: (NSString*) name completion: (void (^) (UIImage*))callback {
dispatch_async(image_queue, ^(void){
[image_lock_handle lock];
@autoreleasepool {
UIImage* image = [UIImage imageNamed: name];
[image_lock_handle unlock];
[image tns_forceDecode];
dispatch_async(dispatch_get_main_queue(), ^(void) {
callback(image);
});
}
});
}
+ (UIImage*) tns_safeImageNamed: (NSString*) name {
[image_lock_handle lock];
UIImage* image = [UIImage imageNamed: name];
[image_lock_handle unlock];
UIImage* image;
@autoreleasepool {
image = [UIImage imageNamed: name];
}
return image;
}
+ (void) tns_decodeImageWithData: (NSData*) data completion: (void (^) (UIImage*))callback {
dispatch_async(image_queue, ^(void) {
@autoreleasepool {
UIImage* image = [UIImage imageWithData: data];
[image tns_forceDecode];
dispatch_async(dispatch_get_main_queue(), ^(void) {
callback(image);
});
}
});
}
+ (void) tns_decodeImageWidthContentsOfFile: (NSString*) file completion: (void (^) (UIImage*))callback {
dispatch_async(image_queue, ^(void) {
@autoreleasepool {
UIImage* image = [UIImage imageWithContentsOfFile: file];
[image tns_forceDecode];
dispatch_async(dispatch_get_main_queue(), ^(void) {
callback(image);
});
}
});
}