¿Desea que su hilo se detenga solo hasta que otro hilo le indique que se inicie de nuevo? Si es así, podría usar un NSConditionLock. Un NSConditionLock es similar a una variable de condición. Tiene un par de métodos básicos, lockWhenCondition, y unlockWithCondition, y lock. Un uso típico es tener el hilo de fondo en espera en el bloqueo de condición con "lockWhenCondition:" y el hilo en primer plano para establecer la condición, lo que hace que el hilo de fondo se active. La condición es un número entero simple, generalmente una enumeración.
He aquí un ejemplo:
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];
}
En este ejemplo, cuando se llama startDoingWork doBackgroundWork: se iniciará en un subproceso en segundo plano, pero luego se detiene porque no hay ningún trabajo que hacer. Una vez que se invoca notifyBackgroundThreadAboutNewWork, doBackgroundWork: se iniciará y procesará el nuevo trabajo, y luego volverá a quedarse dormido a la espera de que haya nuevo trabajo disponible, lo que sucederá la próxima vez que se llame a notifyBackgroundThreadAboutNewWork.
En realidad, no está claro de inmediato _ lo que estás preguntando ... –