Итак, у меня есть класс-оболочка, который, когда я отправляю ему сообщение, возвращает 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);
}
Это не работает, и оно висит. Как я могу реализовать что-то вроде этого без зависания?
Так что же вы сделали вместо отправки семафоров? Я вхожу в аналогичную позицию, мне нужно дождаться, когда метод копирования будет закончен, прежде чем я запустим другой блок копии. – Westley
Я заменил его на очередь на выполнение - запросы могут стоять в очереди в стеке, и для внутренних запросов обрабатывать запросы в очереди. Затем я создал быстрый внутренний промежуточный подкласс, который блокирует собственный поток, когда очередь заполнена. Таким образом, мне не нужно беспокоиться о блокировке обоих концов PDO. –