2012-02-13 2 views
3

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

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

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

ответ

0

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

+0

Так что же вы сделали вместо отправки семафоров? Я вхожу в аналогичную позицию, мне нужно дождаться, когда метод копирования будет закончен, прежде чем я запустим другой блок копии. – Westley

+0

Я заменил его на очередь на выполнение - запросы могут стоять в очереди в стеке, и для внутренних запросов обрабатывать запросы в очереди. Затем я создал быстрый внутренний промежуточный подкласс, который блокирует собственный поток, когда очередь заполнена. Таким образом, мне не нужно беспокоиться о блокировке обоих концов PDO. –

2

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

+0

Да, но моя «задача» в моей очереди - это сообщение «Портативный распределенный объект». Когда он возвращается, это просто означает, что задача была отправлена ​​внешнему процессу, а не завершена. Мне нужно дождаться завершения задачи (на которой объект PDO обращается ко мне обратным вызовом). –

Смежные вопросы