From a4d235426bb38a663676fc525ad8a50a3edb4586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesu=CC=81s=20A=2E=20A=CC=81lvarez?= Date: Wed, 25 May 2016 19:50:54 +0200 Subject: [PATCH] cache disk icons --- Mini vMac.xcodeproj/project.pbxproj | 3 +++ Mini vMac/UIImage+DiskImageIcon.h | 1 + Mini vMac/UIImage+DiskImageIcon.m | 30 ++++++++++++++++++++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Mini vMac.xcodeproj/project.pbxproj b/Mini vMac.xcodeproj/project.pbxproj index 07fb139..f63be30 100644 --- a/Mini vMac.xcodeproj/project.pbxproj +++ b/Mini vMac.xcodeproj/project.pbxproj @@ -879,6 +879,7 @@ 28F6B4961CF07DDD002D76D0 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 28F6B4AE1CF07EC9002D76D0 /* Build configuration list for PBXNativeTarget "libmfs" */ = { isa = XCConfigurationList; @@ -887,6 +888,7 @@ 28F6B4B01CF07EC9002D76D0 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 28F6B4BC1CF07F32002D76D0 /* Build configuration list for PBXNativeTarget "libres" */ = { isa = XCConfigurationList; @@ -895,6 +897,7 @@ 28F6B4BE1CF07F32002D76D0 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/Mini vMac/UIImage+DiskImageIcon.h b/Mini vMac/UIImage+DiskImageIcon.h index 9e1d449..fac4cdb 100644 --- a/Mini vMac/UIImage+DiskImageIcon.h +++ b/Mini vMac/UIImage+DiskImageIcon.h @@ -11,5 +11,6 @@ @interface UIImage (DiskImageIcon) + (UIImage *)imageWithIconForDiskImage:(NSString *)path; ++ (NSCache *)diskImageIconCache; @end diff --git a/Mini vMac/UIImage+DiskImageIcon.m b/Mini vMac/UIImage+DiskImageIcon.m index 43c5d68..e1b92a6 100644 --- a/Mini vMac/UIImage+DiskImageIcon.m +++ b/Mini vMac/UIImage+DiskImageIcon.m @@ -10,6 +10,7 @@ #import "libhfs.h" #import "res.h" #import "mfs.h" +#import "AppDelegate.h" #define kDiskImageHasDC42Header 1 << 0 #define RSHORT(base, offset) ntohs(*((short *)((base) + (offset)))) @@ -22,10 +23,37 @@ @end +static NSCache *diskImageIconCache = nil; + @implementation UIImage (DiskImageIcon) ++ (NSCache *)diskImageIconCache { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + diskImageIconCache = [NSCache new]; + diskImageIconCache.name = @"net.namedfork.minivmac.icon-cache"; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_didEjectDisk:) name:MNVMDidEjectDiskNotification object:nil]; + }); + return diskImageIconCache; +} + ++ (void)_didEjectDisk:(NSNotification*)notification { + NSString *path = [notification.userInfo[@"path"] stringByStandardizingPath]; + // reload icon + [diskImageIconCache removeObjectForKey:path]; + [self imageWithIconForDiskImage:path]; +} + + (UIImage *)imageWithIconForDiskImage:(NSString *)path { - return [[DiskImageIconReader new] iconForDiskImage:path]; + path = path.stringByStandardizingPath; + UIImage *icon = [[self diskImageIconCache] objectForKey:path]; + if (icon == nil) { + icon = [[DiskImageIconReader new] iconForDiskImage:path]; + if (icon != nil) { + [diskImageIconCache setObject:icon forKey:path]; + } + } + return icon; } @end