Вы хотите, чтобы ваш поток просто остановился, пока какой-нибудь другой поток не скажет, что он снова запустится? Если это так, вы можете использовать NSConditionLock. NSConditionLock похож на условную переменную. У него есть несколько основных методов, lockWhenCondition и unlockWithCondition, и lock. Типичное использование состоит в том, чтобы ваш фоновый поток ожидал блокировки условия с помощью «lockWhenCondition:», а внутренний поток - для установки условия, которое вызывает пробуждение фонового потока. Условие является простым целым числом, обычно перечислением.
Вот пример:
enum {
kWorkTodo = 1,
kNoWorkTodo = 0
}
- (id)init {
if ((self = [super init])) {
theConditionLock = [[NSCoditionLock alloc] initWithCondition: kNoWorkTodo];
workItems = [[NSMutableArray alloc] init];
}
}
- (void)startDoingWork {
[NSThread detachNewThreadSelector:@selector(doBackgroundWork) toTarget:self withObject:nil];
}
- (void)doBackgroundWork:(id)arg {
while (YES) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSArray *items = nil;
[theConditionLock lockWhenCondition:kWorkTodo]; // Wait until there is work to do
items = [NSArray arrayWithArray:workItems]
[workItems removeAllObjects];
[theConditionLock unlockWithCondition:kNoWorkTodo];
for(id item in items) {
// Do some work on item.
}
[pool drain];
}
}
- (void)notifyBackgroundThreadAboutNewWork {
[theConditionLock lock];
[workItems addObject:/* some unit of work */];
[theConditionLock unlockWithCondition:kWorkTodo];
}
В этом примере, когда startDoingWork называется doBackgroundWork: запускается в фоновом потоке, но затем останавливается, потому что не нужно выполнять никаких действий. После вызова notifyBackgroundThreadAboutNewWork doBackgroundWork: запустит и обработает новую работу, а затем вернется в спящий режим в ожидании доступности новой работы, что произойдет при следующем вызове notifyBackgroundThreadAboutNewWork.