NSThread sleepfortimeinterval bloquea el hilo principal

Quiero simular una comunicación con un server. Como el server remoto tendrá algunos retrasos, quiero usar un hilo de background que tenga en él

[NSThread sleepForTimeInterval:timeoutTillAnswer]; 

El subprocess se crea con subclass NSThread e inició … Sin embargo, noté que sleepForTimeInterval está bloqueando el subprocess principal … ¿Por qué? ¿No es un NSThread un backgroundThread de forma pnetworkingeterminada?

Así es como se crea el hilo:

  self.botThread = [[PSBotThread alloc] init]; [self.botThread start]; 

Más información: Este es el subclaso de subprocess bot.

 - (void)main { @autoreleasepool { self.gManager = [[PSGameManager alloc] init]; self.comManager = [[PSComManager alloc] init]; self.bot = [[PSBotPlayer alloc] initWithName:@"Botus" andXP:[NSNumber numberWithInteger:1500]]; self.gManager.localPlayer = self.bot; self.gManager.comDelegate = self.comManager; self.gManager.tillTheEndGame = NO; self.gManager.localDelegate = self.bot; self.comManager.gameManDelegate = self.gManager; self.comManager.isBackgroundThread = YES; self.comManager.logginEnabled = NO; self.gManager.logginEnabled = NO; self.bot.gameDelegate = self.gManager; BOOL isAlive = YES; // set up a run loop NSRunLoop *runloop = [NSRunLoop currentRunLoop]; [runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; [self.gManager beginGameSP]; while (isAlive) { // 'isAlive' is a variable that is used to control the thread existence... [runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; } } } - (void)messageForBot:(NSData *)msg { [self.comManager didReceiveMessage:msg]; } 

Quiero llamar a "messageForBot" desde el hilo principal … también el hilo de background debe llamar a un método en el hilo principal para comunicarse .. El intervalo de time de interferencia en el interior del object gManager ….

Bloquea el hilo en el que sleepForTimeInterval se está ejecutando. Ejecutarlo en otro subprocess para simular el retraso del server de esta forma:

 dispatch_queue_t serverDelaySimulationThread = dispatch_queue_create("com.xxx.serverDelay", nil); dispatch_async(serverDelaySimulationThread, ^{ [NSThread sleepForTimeInterval:10.0]; dispatch_async(dispatch_get_main_queue(), ^{ //Your server communication code here }); }); 

Intenta crear un método en tu class de hilo llamada sleepThread

 -(void)sleepThread { [NSThread sleepForTimeInterval:timeoutTillAnswer]; } 

Luego, para que duerma de tu hilo principal

 [self.botThread performSelector:@selector(sleepThread) onThread:self.botThread withObject:nil waitUntilDone:NO]; 

Para enviar actualizado a su hilo principal desde su hilo bot.

 dispatch_async(dispatch_get_main_queue(), ^{ [MainClass somethinghasUpdated]; }); 

Nota lateral

Para crear RunLoop creo que todo lo que necesitas hacer es

 // Run the Current RunLoop [[NSRunLoop currentRunLoop] run]; 

Rápido:

 let nonBlockingQueue: dispatch_queue_t = dispatch_queue_create("nonBlockingQueue", DISPATCH_QUEUE_CONCURRENT) dispatch_async(nonBlockingQueue) { NSThread.sleepForTimeInterval(1.0) dispatch_async(dispatch_get_main_queue(), { // do your stuff here }) }