On Jun 20, 2011, at 11:43 PM, James Merkel wrote: > > > On Jun 20, 2011, at 7:23 PM, Conrad Shultz wrote: > >> -----BEGIN PGP SIGNED MESSAGE----- >> Hash: SHA1 >> >> On 6/20/11 3:54 PM, James Merkel wrote: >>> I'm opening all digital camera files in a folder (JPEG, TIF, etc), >>> extracting a thumbnail and some Exif data, and putting the data in a >>> TableView. The time consuming part is finding the thumbnails in the files. >> >> OK. >> >> I don't know anything about extracting thumbnails et al., but for the >> sake of argument suppose you have a class JMImageProcessor that has >> methods like: >> >> - - (id)initWithFileHandle:(NSFileHandle *)fileHandle; >> - - (NSDictionary *)exifData; >> - - (NSImage *)thumbnail; // Takes a long time to run >> >> So in your main thread you then have a loop over a bunch of >> NSFileHandles (of course you might be accessing the files completely >> differently; this is just for illustration). So you might currently have: >> >> for (NSFileHandle *fileHandle in files) { >> JMImageProcessor *processor = [[JMImageProcessor alloc] >> initWithFileHandle:fileHandle]; >> // Call some code to stash the results, presumably updating the >> tableView's data source in the process >> [self setExifData:[processor exifData] forFile:fileHandle]; >> [self setThumbnail:[processor thumbnail] forFile:fileHandle]; >> [processor release]; >> // Call some code to redisplay the NSTableView >> [self updateTable]; >> } >> >> >> >> >> You could make such code non-blocking with, for example, GCD: >> >> >> >> >> dispatch_queue_t workerQueue = >> dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL); >> >> for (NSFileHandle *fileHandle in files) { >> dispatch_async(workerQueue, >> ^{ >> JMImageProcessor *processor = [[JMImageProcessor alloc] >> initWithFileHandle:fileHandle]; >> [self setExifData:[processor exifData] >> forFile:fileHandle]; >> [self setThumbnail:[processor thumbnail] >> forFile:fileHandle]; >> [processor release]; >> dispatch_async(dispatch_get_main_queue(), >> ^{ >> [self updateTable]; >> // UI updates need to be on the main >> thread, i.e., the GCD main >> queue, so we call back asynchronously >> } >> ); >> } >> ); >> } >> >> (Note 1: this was all written in a mail client and untested.) >> >> (Note 2: the above assumes that the setExifData/setThumbnail methods are >> implemented properly, atomically if required. But if the methods are >> backed by, for example, mutable dictionaries, and anything accessing >> them handle absent entries reasonably, this should be pretty >> straightforward.) >> >> (Note 3: this could all alternatively be done with NSOperationQueue, or >> even plain old NSThread. But GCD can probably do it in the smallest >> amount of code.) >> >> Good luck! >> >> - -- >> Conrad Shultz >> >> Synthetiq Solutions >> www.synthetiqsolutions.com >
> First of all (kind of basic) what is GCD ? > > I have actually implemented this a couple of different ways (not using > threads). > At first I just had lazy loading of the TableView. Whenever the TableView > needed something a file was accessed and a thumbnail extracted. Then I > changed it to do preprocessing. That is, everything was extracted from the > files and then the TableView was allowed to load. The first approach uses > less memory but is slower in updating the TableView (when it is scrolled for > example). The second approach uses more memory but is faster in updating > (provides a better user experience). I think trying to do this in a separate > thread would be much cleaner using the second approach. > > I forgot to mention the really slow case: if a thumbnail can't be found in > the file, then I make a thumbnail from the main image. If this has to be done > on a lot of files, then things really bog down. > > Jim Merkel GCD is Grand Central Dispatch - Apple's very nice API for writing multithreaded code. You should read the Concurrency Programming Guide at developer.apple.com <https://developer.apple.com/library/mac/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html> Dave _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com