hallo zusammen,
ich habe einen NSCollectionView und einen sack voll bilder.
der NSCollectionView bekommt seine Daten aus einem arraycontroller.
ich erstelle pro bild eine datenklasse die erstmal nur den pfad und den namen als bild bekommt. (in einem background thread)
die datenklasse sorgt selbst für das laden und ggf erstellen eines thumbnails vom Bild. (per nsoperation und nsoperationqueue)
das funktioniert auch alles wunderbar, nur es gefällt mir nicht.
der collectionview zeigt erst etwas an, wenn alle bilder geladen sind.
ich hätte gern, dass erstmal alle bilder mit dummybild (wird beim erstellen der datenklasse geladen) angezeigt werden und dann nach und nach
die ganzen bilder geladen werden. ich hoffe ich hab mich halbwegs verständlich ausgedrückt.
hier noch die controllerklasse und die datenklasse
Alles anzeigen
Alles anzeigen
ich habe einen NSCollectionView und einen sack voll bilder.
der NSCollectionView bekommt seine Daten aus einem arraycontroller.
ich erstelle pro bild eine datenklasse die erstmal nur den pfad und den namen als bild bekommt. (in einem background thread)
die datenklasse sorgt selbst für das laden und ggf erstellen eines thumbnails vom Bild. (per nsoperation und nsoperationqueue)
das funktioniert auch alles wunderbar, nur es gefällt mir nicht.
der collectionview zeigt erst etwas an, wenn alle bilder geladen sind.
ich hätte gern, dass erstmal alle bilder mit dummybild (wird beim erstellen der datenklasse geladen) angezeigt werden und dann nach und nach
die ganzen bilder geladen werden. ich hoffe ich hab mich halbwegs verständlich ausgedrückt.
hier noch die controllerklasse und die datenklasse
Quellcode
- #import "ImageBrowserController.h"
- #import "VIPImage.h"
- @implementation ImageBrowserController
- @synthesize xibHasLoaded, imagesArray, operationQueue;
- SYNTHESIZE_SINGLETON_FOR_CLASS(ImageBrowserController);
- #pragma mark - Private Methods
- - (void) addImage : (NSDictionary*) dict {
- VIPImage *i = [VIPImage vipImageWithDict:dict andDelegate:self];
- [self.imageArrayController addObject:i];
- }
- - (void) loadImagesInBackground {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- //int i = 0;
- for (NSString *file in [fileManager contentsOfDirectoryAtPath:@"/Volumes/1TB/Picts" error:nil]) {
- //if (i > 100) break;
- //i++;
- if (![[[file pathExtension] lowercaseString] isEqualToString:@"jpg"]) continue;
- [self performSelectorOnMainThread:@selector(addImage:) withObject:[NSDictionary dictionaryWithObjectsAndKeys:file, @"imageName", @"/Volumes/1TB/Picts", @"imagePath", nil] waitUntilDone:NO];
- //[self addImage:[NSDictionary dictionaryWithObjectsAndKeys:file, @"imageName", @"/Volumes/1TB/Picts", @"imagePath", nil]];
- }
- [pool drain];
- }
- #pragma mark - Public Methods
- - (void) initImageBrowser {
- if (!self.xibHasLoaded)
- [NSBundle loadNibNamed:@"ImageBrowser" owner:self];
- [self.imageBrowserWindow makeKeyAndOrderFront:nil];
- }
- #pragma mark - Initialization
- - (id)init {
- self = [super init];
- if (self) {
- self.xibHasLoaded = NO;
- self.imagesArray = [NSMutableArray array];
- self.operationQueue = [[[NSOperationQueue alloc] init] autorelease];
- }
- return self;
- }
- - (void)dealloc {
- self.imagesArray = nil;
- [super dealloc];
- }
- - (IBAction)update:(id)sender {
- [NSThread detachNewThreadSelector:@selector(loadImagesInBackground) toTarget:self withObject:nil];
- }
Quellcode
- @implementation VIPImage
- #pragma mark - Initialization
- - (id)init {
- self = [super init];
- if (self) {
- self.thumbImage = [NSImage imageNamed:@"dummyImage"];
- self.thumbImagePath = @"/Users/sascha/Desktop/thumbImages";
- self.needSave = NO;
- self.observersHooked = NO;
- }
- return self;
- }
- - (void)dealloc {
- [self removeObservers];
- self.delegate = nil;
- self.thumbImage = nil;
- self.thumbImagePath = nil;
- self.imageName = nil;
- self.imagePath = nil;
- [super dealloc];
- }
- + (VIPImage*) vipImage {
- return [[[VIPImage alloc] init] autorelease];
- }
- + (VIPImage*) vipImageWithDict: (NSDictionary*) dict andDelegate: (ImageBrowserController*) anDelegate {
- VIPImage *vipImage = [VIPImage vipImage];
- vipImage.imageName = ([dict objectForKey:@"imageName"] == [NSNull null]) ? @"" : [dict objectForKey:@"imageName"];
- vipImage.imagePath = ([dict objectForKey:@"imagePath"] == [NSNull null]) ? @"" : [dict objectForKey:@"imagePath"];
- vipImage.delegate = anDelegate;
- if (vipImage.delegate) {
- VIPImageThumbOperation *op = [[[VIPImageThumbOperation alloc] initWithVIPImage:vipImage] autorelease];
- [anDelegate.operationQueue addOperation:op];
- }
- return vipImage;
- }
- + (VIPImage*) vipImageWithDict: (NSDictionary*) dict {
- return [VIPImage vipImageWithDict:dict andDelegate:nil];
- }
- @end