Как приостановить NSThread до уведомления?
У меня есть рабочий поток, который я хочу выполнить один бит своей задачи, затем приостановить и подождать команду "ок, продолжить" из другого потока, затем приостановить и подождать и т. Д.
Сценарий использования: управляющий объект - это представление, в котором я хочу отобразить информацию о том, что происходит внутри рабочего потока, и позволить мне "пошагово" пройти по рабочему, как он это делает.
Довольно уродливая и грубая вещь, которую я имею в своем работнике, такова:
NSLog(@"paused");
paused = YES;
while (paused)
{
[NSThread sleepForTimeInterval:0.25];
}
NSLog(@".. continuing");
... Но я не могу не думать, что должен быть более хороший путь, возможно, с использованием NSLocks или чего-то подобного.
Комментарии, подсказки, предложения?
Спасибо!
1 ответ
Решение
Ознакомьтесь с NSCondition и разделом условий в руководстве Threading. Код будет выглядеть примерно так:
NSCondition* condition; // initialize and release this is your app requires.
//Worker thread:
while([NSThread currentThread] isCancelled] == NO)
{
[condition lock];
while(partySuppliesAvailable == NO)
{
[condition wait];
}
// party!
partySuppliesAvailable = NO;
[condition unlock];
}
//Main thread:
[condition lock];
// Get party supplies
partySuppliesAvailable = YES;
[condition signal];
[condition unlock];