Использование семафоров рассылки с методами делегатов - PullRequest
3 голосов
/ 13 февраля 2012

Итак, у меня есть класс-оболочка, который при отправке ему сообщения возвращает ДА ​​/ НЕТ в зависимости от того, ПОЛУЧИЛ ли внутренний объект сообщение. То есть, когда я отправляю это, оно фактически не возвращается, когда задача выполнена. Я также хочу убедиться, что одновременно выполняется только одна задача, поэтому я использую семафоры диспетчеризации. Мой класс-оболочка вызывает метод делегата, чтобы уведомить меня, что он завершил обработку внутренней задачи.

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);
}

Это не работает и зависает. Как я могу реализовать что-то подобное без зависания?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Если вы хотите убедиться, что одновременно выполняется только одна задача, правильный подход - выполнить каждую задачу в одной и той же последовательной очереди GCD.Последовательная очередь всегда выполняет только одну задачу за раз.Функция dispatch_queue_create создает последовательную очередь при передаче 0 (или DISPATCH_QUEUE_SERIAL или NULL) в качестве второго аргумента ..

0 голосов
/ 15 февраля 2012

Если кому-то нужно знать, это невозможно сделать.Семафор блокирует поток, поэтому вам потребуется отдельный порожденный поток с циклом выполнения, ожидающим изменения переменной.Я просто переработал свой код, чтобы избежать семафоров.

...