Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Dispatch Semaphores with delegate methods

So I have a wrapper class that when I send it a message, it returns YES/NO based on whether the internal object RECEIVED the message. Meaning, when I send this, it doesn't actually return when the task is done. I also want to make sure that only one task is executed at a time, so I use dispatch semaphores. My wrapper class calls a delegate method to notify me that it finished processing the internal task.

dispatch_queue_t queue = dispatch_queue_create("com.test.all", 0); // private queue
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1); // one at a time
...
- (void)doStuff:(NSString *)stuff {
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_sync(queue, ^(void) {
        [myWrapperObject sendRequestToInternalStuff:stuff];
    }
}
...
- (void)myWrapperClassProcessingIsDone {
    dispatch_semaphore_signal(semaphore);
}

This doesn't work, and it hangs. How can I implement something like this without hanging?

like image 730
Aditya Vaidyam Avatar asked Jul 20 '26 21:07

Aditya Vaidyam


2 Answers

If you want to ensure that only one task is executed at a time, the correct approach is to execute each task on the same serial GCD queue. A serial queue always executes just one task at a time. The dispatch_queue_create function creates a serial queue when you pass 0 (or DISPATCH_QUEUE_SERIAL or NULL) as the second argument..

like image 131
rob mayoff Avatar answered Jul 23 '26 11:07

rob mayoff


If anyone needs to know, there is no way to do this. The semaphore locks the thread, so you would have to have a separate spawned thread with a run-loop waiting for a variable change. I just re-worked my code to avoid semaphores.

like image 37
Aditya Vaidyam Avatar answered Jul 23 '26 09:07

Aditya Vaidyam



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!