Je veux simuler une communication avec un serveur. Comme le serveur distant aura des retards, je souhaite utiliser un fil d’arrière-plan contenant
[NSThread sleepForTimeInterval:timeoutTillAnswer];
Le thread est créé avec la sous-classification NSThread et a commencé ... Cependant, j'ai remarqué que sleepForTimeInterval bloque le thread principal ... Pourquoi ??? NSThread n'est-il pas un backgroundThread par défaut?
Voici comment le fil est créé:
self.botThread = [[PSBotThread alloc] init];
[self.botThread start];
Informations complémentaires: Voici les sous-classes du thread de 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];
}
Je souhaite appeler "messageForBot" à partir du thread principal ... le thread d'arrière-plan doit également appeler une méthode sur le thread principal pour communiquer. L'intervalle de veille temporelle à l'intérieur de l'objet gManager ....
Il bloque le thread en cours d'exécution sleepForTimeInterval. Exécutez-le sur un autre thread pour simuler le délai de votre serveur comme ceci:
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
});
});
Essayez de créer une méthode dans votre classe de thread appelée sleepThread.
-(void)sleepThread
{
[NSThread sleepForTimeInterval:timeoutTillAnswer];
}
Puis pour le faire dormir de votre fil principal
[self.botThread performSelector:@selector(sleepThread) onThread:self.botThread withObject:nil waitUntilDone:NO];
Pour envoyer mis à jour à votre fil principal à partir de votre fil de bot.
dispatch_async(dispatch_get_main_queue(), ^{
[MainClass somethinghasUpdated];
});
Note latérale
Pour créer le RunLoop, je pense que tout ce que vous avez à faire est
// Run the Current RunLoop
[[NSRunLoop currentRunLoop] run];
Rapide:
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
})
}