Re: NSDocument's Open File Panel unresponsive when opening large file from disc
Re: NSDocument's Open File Panel unresponsive when opening large file from disc
- Subject: Re: NSDocument's Open File Panel unresponsive when opening large file from disc
- From: Quincey Morris <email@hidden>
- Date: Tue, 29 Jan 2013 13:03:39 -0800
On Jan 29, 2013, at 12:00 , Gilles Celli <email@hidden> 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 (email@hidden)
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:
This email sent to email@hidden