Estoy tratando de usar un hilo separado para trabajar con alguna API.iPhone: cómo usar performSelector: onThread: withObject: waitUntilDone: method?
El problema es que no puedo usar el método performSelector:onThread:withObject:waitUntilDone:
con un hilo que he instanciado para esto.
Mi código:
@interface MyObject : NSObject {
NSThread *_myThread;
}
@property(nonatomic, retain) NSThread *myThread;
@end
@implementation MyObject
@synthesize myThread = _myThread;
- (NSThread *)myThread {
if (_myThread == nil) {
NSThread *myThreadTemp = [[NSThread alloc] init];
[myThreadTemp start];
self. myThread = myThreadTemp;
[myThreadTemp release];
}
return _myThread;
}
- (id)init {
if (self = [super init]) {
[self performSelector:@selector(privateInit:) onThread:[self myThread] withObject:nil waitUntilDone:NO];
}
return self;
}
- (void)privateInit:(id)object {
NSLog(@"MyObject - privateInit start");
}
- (void)dealloc {
[_myThread release];
_myThread = nil;
[super dealloc];
}
@end
"MyObject - privateInit start"
no se imprime.
¿Qué me estoy perdiendo?
Intenté crear una instancia del subproceso con el destino y el selector, intenté esperar la finalización de la ejecución del método (waitUntilDone:YES
).
Nada ayuda.
ACTUALIZACIÓN:
No necesito este multiproceso para separar las operaciones costosas de otro hilo.
En este caso podría usar el performSelectorInBackground
como se menciona en algunas respuestas.
La razón principal para este hilo separado es la necesidad de realizar todas las acciones en la API (TTS por Loquendo) desde un solo hilo.
Lo que significa que tengo que crear una instancia del objeto TTS y llamar a métodos en ese objeto desde el mismo hilo todo el tiempo.
¿No están creando un bucle infinito de esa manera? Si el runloop no tiene nada que ver, simplemente se cerrará inmediatamente y todo lo que haces es llamar '- run' con la frecuencia que tu procesador pueda manejar. (Uso de la CPU al 100%) – bastibe
Infinite - sí. Pero el ciclo no itera todo el tiempo. He puesto una línea de registro (NSLog ...) dentro del tiempo y solo se llamó una vez ... –
Esto es un comportamiento inesperado y no se debe confiar en él. Un bucle de ejecución sin fuentes de entrada o temporizadores configurados debe salir inmediatamente, y por lo tanto, su bucle debe ejecutarse constantemente, una y otra vez, usando 100% de CPU, como decía el cartel. Consulte los documentos de nsrunloop para obtener más información. –