Thanks for the approach Kyle, but dispatch_async performs asynchronously, so it 
should not block the main thread. I fallback to performSelectorOnMainThread: 
method in my app, but the dispatch way is a bit straightforward in my opinion. 
I'll fill a rdar on this. 

 

On Dec 16, 2012, at 8:39 PM, Kyle Sluder <k...@ksluder.com> wrote:

> On Sun, Dec 16, 2012, at 11:28 AM, Kyle Sluder wrote:
>> My guess is that NSOpenPanel is doing some work on a background thread,
>> and that work is trying to use the main queue to inform the open panel
>> of its completion. By using the dispatch_async approach, the main queue
>> is blocked, and the background thread can't inform the open panel. The
>> -performSelector::: approach uses a timer, so the nested invocation of
>> the runloop that -runModal performs is still able to dequeue the
>> background task completion's block off the main queue.
> 
> To follow up:
> 
> In general, it's just a bad idea to block the main queue. It so happens
> that currently CFRunLoop is responsible for draining the main queue in a
> runloop-based app, so your app is able to hobble along firing timers and
> doing delayed-performs. But one can envision that dependency being
> inverted in a future release of OS X such that it's the main queue
> that's responsible for driving the runloop. At that point, blocking the
> main queue would cause deadlock when you tried to reentrantly run the
> runloop.
> 
> In 10.6, NSOpenPanel and NSSavePanel gained a
> -beginWtihCompletionHandler: method that lets you run the panel as a
> non-modal window. Consider using that instead of -runModal.
> 
> --Kyle Sluder


_______________________________________________

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