let serialQueue = DispatchQueue(label: "Serial Queue")
func performCriticalSectionTask() {
 serialQueue.async {
   performLongRuningAsyncTask()
 }
}
func performLongRuningAsyncTask() {
  /// some long running task
}
The function performCriticalSectionTask() can be called from different places many times.
I want this function to be running one at a time. Thus, I kept the critical section of code inside the serial async queue.
But, the problem here is that the critical section itself is a performLongRuningAsyncTask() which will return immediately, and thus serial queue will not wait for the current task to complete first and will start another one.
How can I solve this problem?
 
    