• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Waiting for callback with GCD: impossible?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Waiting for callback with GCD: impossible?


  • Subject: Re: Waiting for callback with GCD: impossible?
  • From: Ken Thomases <email@hidden>
  • Date: Wed, 08 Oct 2014 14:28:39 -0500

On Oct 8, 2014, at 1:59 PM, Jens Alfke <email@hidden> wrote:

> * 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.)

Queues are not like run loops nor threads.  Your desire to have ongoing logic occur on a particular queue seems odd to me.  The main purpose for custom queues would be to synchronize access to specific resources.  Why is there "logic on queue A" that's doing anything other than briefly accessing a shared resource?

For what it's worth, GCD isn't a good fit for the "future" design pattern.  The GCD "way" of doing this is to have a task that will be executed asynchronously at the time the result becomes available.  The A logic shouldn't wait; it should arrange for whatever work it would do when the wait is over to happen at that time.  Then it should end.

> * 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.

Yup.

> 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?

Avoid it.  The desire to turn async work to synchronous work is the root of the problem.

That said, the task on queue B could signal a semaphore or leave a group, rather than attempting to submit a task to queue A.  If you must block waiting for the result, the A logic could wait on the semaphore or group.  Better would be to use dispatch_group_notify() to just perform the when-the-result-is-ready work when it's ready.

Regards,
Ken


_______________________________________________

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


  • Follow-Ups:
    • Re: Waiting for callback with GCD: impossible?
      • From: Jens Alfke <email@hidden>
References: 
 >Waiting for callback with GCD: impossible? (From: Jens Alfke <email@hidden>)

  • Prev by Date: Re: Waiting for callback with GCD: impossible?
  • Next by Date: UIWebView not scaling page (iOS8)
  • Previous by thread: Re: Waiting for callback with GCD: impossible?
  • Next by thread: Re: Waiting for callback with GCD: impossible?
  • Index(es):
    • Date
    • Thread