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 ([email protected])
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 [email protected]