Hi,

I do something like this which works really well but NOT on the Main Thread, on 
a background thread. 


-(NSData*) performSyncRequest
{
dispatch_group_t                                                myDispatchGroup;

//**
//**    Create and Enter a Dispatch Group
//**
myDispatchGroup = dispatch_group_create();
dispatch_group_enter(myDispatchGroup);

[self doSomethingWithCompletionHandler:
        ^(NSError* theErrorInfo)
                {
                                
//**
//**    Signal Response Received
//**
                dispatch_group_leave(myDispatchGroup);
                }
];


//**
//**    Wait for the Response  - Check for Time-Out Error
//**
myTimeOutStatus = 
dispatch_group_wait(myDispatchGroup,dispatch_time(DISPATCH_TIME_NOW,kLTWNetworkOperationTimeOutPeriodNS));
if (myTimeOutStatus != 0)
                {
                dispatch_group_leave(myDispatchGroup);
                }

//**
//**    Handle Request Completed - Perform any delegate methods
//**
NSData* myRequestData = [self getData];
        
dispatch_release(myDispatchGroup);

return myRequestData;
}

Cheers
Dave


> On 29 Jun 2015, at 17:14, Gavin Eadie <ga...@umich.edu> wrote:
> 
> It’s standard knowledge that any operation which causes an app’s main thread 
> to wait is bad, and that diverting such delays off the main thread allows the 
> app to remain optimally responsive to external events.  That diversion can 
> happen via a couple of mechanisms: ‘callbacks’  (delegation and closures) 
> that are inherent in an API; and explicit transfer via GCD (or NSOperation at 
> a more abstract level).
> 
> My question for the list originates with a friend who is updating an app in 
> which previously synchronous call needs to be replaced by asynchronous one (a 
> Image Capture Core method, using a delegate).  Leaving aside, if possible, 
> the reasons for this, he has retained an apparent synchronous nature of the 
> original call by wrapping the new ‘requestSend..’ method and its 
> corresponding ‘didSend..’ delegate so that the wrapper appears to block its 
> thread while actually allowing the main run loop to execute.
> 
> The intent is to have code of the form:
> 
>  .. before
>   fakeSyncrony
>   after ..
> 
>      where, though “fakeSyncrony” is actually internally asynchronous, 
> “after” is not executed till after the its delegate action completes.
> 
> This works well if the above code executes off the main thread because any 
> waiting inside “fakeSyncrony” can happen in the main run-loop and 
> responsiveness is retained.
> 
> It does not work if that code is on the main thread because there’s no way to 
> put the waiting on the, now already occupied, main thread, and that’s where 
> the question lies.  While it seems clear to me and my friend that this in an 
> inescapable fact of life, we have a counterexample in the form of the Canon 
> ED-SDK, which somehow does accomplish this.
> 
> Can anyone, with more knowledge than we have, suggest a trick that allows an 
> apparently synchronous call on the main thread without impacting performance?
> 
> PS: If I was answering this question, I’d suggest getting off the main thread 
> and not playing tricks.  So the answer “Don’t do this!” is already very high 
> on the list .. another answer, regardless of nastiness, does exist but it’s 
> beyond my skill to devise, but there are much smarter people than I on this 
> list!
> _______________________________________________
> 
> 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/dave%40looktowindward.com
> 
> This email sent to d...@looktowindward.com


_______________________________________________

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