I know this is not a strong question but I have to clear my mind on this concept.
I have defined myBlock
as follows.
void(^myBlock)(void) = ^{
for(int i = 0;i < 10 ; i++)
{
NSLog(@"%d and current queue = %@",i,[NSThread currentThread]);
}
};
Now In viewDidLoad
method when I uses the dispatch_sync()
method independently on main queue then the main queue gets blocked.
Here is the Sample.
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue,myBlock);
}
But But, when I use the same dispatch_sync()
function on main thread Inside a block of dispatch_async()
function which is fired on concurrent queue then the main thread does not blocked.
Here is the sample.
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue,^{
dispatch_sync(dispatch_get_main_queue(),myBlock);
});
}
I am not clear why this is happening? Why main thread blocked when calling dispatch_sync()
independently?
When using dispatch_sync
on a serial queue (like the main queue) the current thread has to wait until the dispatched code is executed.
A dead lock occurs when a block is dispatched synchronously on from a serial queue to the same queue.
There is only one main queue. In your first example, viewDidLoad
is running on it. You then tell viewDidLoad
to wait (i.e. "sync") on something else that's going to run on the main queue. They both can't be on it at exactly the same time.
In your second example, it's the concurrent queue that's being told to wait. That's not a problem because by doing dispatch_async
, viewWillLoad
is giving up the main queue and making it available for your block to run.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With