On a related topic from my last post, looking at the equivalent situation but 
using GCD instead of runloops, the problem appears to be impossible. That is:

* Code running on dispatch queue A starts some async task that will run on 
another queue B, and which will signal completion by using dispatch_async to 
call a completion block on queue A, passing it some result.

* After the task starts, the logic on queue A decides it needs to block until 
the task finishes and returns its result. (This might be part of an 
implementation of the 'future' design pattern, for example.)

* Now, how does queue A wait for the callback? It seems to be impossible: the 
only way for code running on queue A to receive the callback is to return back 
to the queue dispatcher, so if it tries to wait it simply blocks the queue, 
causing a deadlock.

This is exactly why runloops have the ability to run a "nested" loop, to block 
but still allow incoming messages. Of course that comes with its own set of 
complications, like the necessity for multiple "modes", and issues like the one 
I just brought up.

But given that dispatch queues can't do this, what's the solution to this 
design problem, i.e. turning an async call into a sync one?

—Jens
_______________________________________________

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