GCD:
A library to provide support for concurrent code execution on multicore hardware in iOS. It provides an easier mechanism to access multi-thread environment without taking the overhead of lock and unlock shared data, create a thread and perform a task like that.
If we use NSThread or pthread in the application then we need to take care of so much point. Like if I need to execute 10 tasks concurrently in my application. How much thread pool I require, how to synchronise two tasks while using threads.
It provides methods to add a task in a queue.
1) Dispatch Async
2) Dispatch Sync
If we use NSThread or pthread in the application then we need to take care of so much point. Like if I need to execute 10 tasks concurrently in my application. How much thread pool I require, how to synchronise two tasks while using threads.
It provides methods to add a task in a queue.
1) Dispatch Async
2) Dispatch Sync
Dispatch Async:
This method is used to add a block for asynchronous execution and return immediately. If you used this method to add a block then it will return immediately and does not wait for execution of the block.
If you do not want to wait for the execution of the block then you can use this method to add operation in a dispatch queue.
What will be the output here?
1) Task 1 print first then all block value 0..99
2) First All block value 0..99 and Then Task 1
3) Cannot Determine the behaviour
The solution is Option 3 you cannot determine the behaviour, in this case, it totally depends on when the global queue picks the task and execute it.
If you do not want to wait for the execution of the block then you can use this method to add operation in a dispatch queue.
- (void) performMyTask{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"Block %lu", (unsigned long)i);
}
});
//Your block task
for (NSUInteger i=0; i < 100;i++) {NSLog(@"Block %lu", (unsigned long)i);
}
});
//Task 1
NSLog(@"Task1");
}
1) Task 1 print first then all block value 0..99
2) First All block value 0..99 and Then Task 1
3) Cannot Determine the behaviour
The solution is Option 3 you cannot determine the behaviour, in this case, it totally depends on when the global queue picks the task and execute it.
Dispatch Sync:
i.e. It blocks the current thread If you used this method then the function will not return until your block is not executed fully. If you want to wait for your block execution you can use this method.
- (void) performMyTask{
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"Block %lu", (unsigned long)i);
}
});
//Your block task
for (NSUInteger i=0; i < 100;i++) {NSLog(@"Block %lu", (unsigned long)i);
}
});
//Task 1
NSLog(@"Task1");
}
What will be the output here?
1) Task 1 print first then all block value 0..99
2) First All block value 0..99 and Then Task 1
3) Cannot Determine the behaviour
The solution is Option 2 the behaviour is well defined in this case method will not return until the block is not executed. So all the block value is executed first then the Task1.
What will happen?
If I use dispacth_sync on the main queue in the view controller life cycle method?
- (void) viewDidLoad{
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"Block %lu", (unsigned long)i);
}
});
//Your block task
for (NSUInteger i=0; i < 100;i++) {NSLog(@"Block %lu", (unsigned long)i);
}
});
//Task 1
NSLog(@"Task1");
}
Your application will crash or become unresponsive because of the deadlock cycle. Dispatch block waits for the main queue to be free and the main queue is blocked to execute the dispatched task.
More Dispatch Sync
Comments
Post a Comment