On Jan 29, 2013, at 12:00 , Gilles Celli <gilles.ce...@ecgs.lu> wrote:

> Ok, sounds good...but what bothers me is that I'm using an NSDocument based 
> app:
> so can I use without problems NSOpenPanel's 
> beginSheetModalForWindow:completionHandler: method instead of using 
> NSDocument's readFomURL:ofType:error ?

If *your* code is displaying the open panel, then ordering-out the open panel 
before you start your processing should be no problem. That's what I thought 
you were doing, but apparently not.

If you are relying on NSDocumentController to display the open panel, invoke 
its default methods, down to 'readFromURL', and that's the first time your code 
gets control, then it's a bit harder.

There are several possible approaches:

1. In 'readFromURL:', dispatch your conversion as a separate asynchronous 
operation (either using GCD or NSOperationQueue). In that case, your document 
will go ahead and open normally, but that could happen before your conversion 
is complete, so your window controller/document initialization code would have 
to take that into account.

2. Provide your own 'openDocument:' method. Read the comments in 
NSDocumentController.h to find out the standard behavior, and tweak the 
behavior to make sure the open doesn't happen before open panel is dismissed. 
That likely means invoking 
'openDocumentWithContentsOfURL:display:completionHandler:' from a separate 
asynchronous operation, rather than directly from the 
'beginOpenPanelWithCompletionHandler:' completion handler.

3. As you suggested earlier, defer the conversion to a later time. You can't 
really do it synchronously while window controllers are being created, since 
that would block the main thread, so in practice, you have to wait till the 
window controller's 'windowDidLoad' (or the document's 
windowControllerDidLoadNib:') to start the conversion. This approach also means 
that your window will be open possibly before the conversion is complete.

4. You can use a hybrid approach, overriding 'openDocument:' so that you can 
invoke 'openDocumentWithContentsOfURL:display: NO completionHandler:' to skip 
the creation of windows, then dispatch your conversion asynchronously, then 
create your window controllers (on the main thread) after the conversion is 
done.

I don't know of any easier ways of doing this. It's something of a deficiency 
in the NSDocument architecture, which wasn't originally designed to do anything 
asynchronously. Of course, I may be missing something obvious.

_______________________________________________

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to