То, что вы здесь делаете, требует использования semaphore
, например.Если в этом нет ничего, кроме того, что вы предоставляете здесь, то лучший способ сделать это - выполнить блок завершения для метода фонового запуска. См. Вариант 2 ниже
В любом случае, почему вы хотите, чтобы родительский поток (поток, отправляющий новый поток) ожидал другого потока?Если родительский поток ожидает, он блокируется до тех пор, пока не будет завершен отправленный поток (согласно вашему требованию).Эта ситуация избыточна, потому что весь смысл отправки другого потока заключается в том, чтобы родительский поток мог продолжить выполнение других задач.Если, конечно, родительский поток не должен ожидать нескольких потоков, то имеет смысл заблокировать его.
Сказав это, лучше всего просто позволить потоку-отправителю / родительскому потоку выполнить обработку, на которую вы отправляетев другую ветку.Я говорю это только с учетом предоставленной вами информации.
- ВАРИАНТ 1 использовать семафор
Использовать семафор для блокировки и разблокировки родительского потока
-(void)getStatusPrinter()
{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[NSThread detachNewThreadSelector:@selector(checkBeforePrint2) toTarget:self withObject: semaphore];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[self print]; // this will run after semaphore is unlocked
}
-(void)checkBeforePrint2:(dispatch_semaphore_t)sem
{
//this is within child thread
//do some processing,
dispatch_semaphore_signal(sem);//unlock semaphore
}
Но, как я упоминал ранее, эта ситуация кажется избыточной, поскольку родительский поток ожидает (поэтому не может использоваться) дочерний поток;почему он не может просто выполнить саму работу ...
- ВАРИАНТ 2 использовать блок завершения (PREFERABLE)
Использоватьблок завершения, который вы передаете дочернему потоку.Это позволяет родительскому потоку продолжить.Если это основной поток, он остается свободным для пользовательского интерфейса.
-(void)getStatusPrinter()
{
[self checkBeforePrint2WithCompletion: ^{
[self print];
}];
//continue with more stuff
}
-(void)checkBeforePrint2WithCompletion:(void (^ __nullable)(void))completion
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//do something before executing completion code
if(completion){
completion();
}
});
}
Отказ от ответственности: в этом коде могут быть опечатки, так как они не были написаны в редакторе / IDE.Пожалуйста, прокомментируйте, если таковые имеются.
- ОБНОВЛЕНИЕ в ответ на добавленные детали.
Хорошо, за то, что вы сказали, что вам нужновернуть результат в другое приложение, это означает, что поток записи в getStatusPrinter
не может быть возвращен после отправки нового потока.Если вам действительно нужно создать новый поток для CheckBeforePrint
, то поток ввода должен ждать.Это для меня бессмысленно.Вы можете просто запустить все в потоке ввода.
Если вы используете openURL:options:completionHandler:
, то поток ввода не должен ждать.Значение result
может быть передано обратно в блоке завершения.
Пожалуйста, обратитесь к документации Apple на openURL с дескриптором завершения