Если вы выполняете свои HTTP-запросы на NSURLConnection или аналогичном и пытаетесь разблокировать его в делегате, вам нужно быть осторожным, когда вы создаете и инициируете NSURLConnection, поскольку он должен вернуться в этот поток, если вы явно не используете scheduleInRunLoop:mode
чтобы поместить его в другой поток или цикл выполнения.
Если вы уверены, что блокируете основной поток, вам следует разблокировать этот поток.Чтобы вернуться туда, вы можете использовать либо performSelectorOnMainThread:withObject:waitUntilDone:
обратный вызов, либо GCD для обратного вызова в главном потоке, используя:
dispatch_async(dispatch_get_main_queue(), ^(void) {
...
});
С вашими разблокировками в ... пробел.Вместо этого вы могли бы использовать dispatch_sync()
, если вам нужно знать, что разблокировка завершена, прежде чем двигаться дальше.
Однако, используя NSConditionLock
, как вы уже указали, вы уже пытались решить эту проблему.Тем не менее, вам все равно нужно сделать блокировку в потоке поиска, а не в основном потоке.Условие будет защищено вашим -unlockWithCondition:
с использованием определенного условия, поэтому оно не будет разблокировано до того, как поисковый поток пометит его как готовый.
Итак, в вашем основном потоке запустите поисковые потоки.В каждом потоке поиска -lock
, а затем приступайте к извлечению данных, затем -unlockWithContidition:
.В потребительской ветке используйте -lockWhenCondition
, и с вами все будет в порядке.
Однако ключ в том, что вы должны блокировать и разблокировать в одной и той же цепочке.