15

サーバーとの通信をシミュレートしたい。リモートサーバーには多少の遅延があるため、バックグラウンドスレッドを使用したい

 [NSThread sleepForTimeInterval:timeoutTillAnswer];

スレッドは NSThread サブクラスで作成され、開始されます...しかし、sleepForTimeInterval がメインスレッドをブロックしていることに気付きました...なぜですか? デフォルトでは、NSThread は backgroundThread ではありませんか?

スレッドの作成方法は次のとおりです。

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

詳細情報: これはボットスレッドのサブクラスです

- (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];
}

メインスレッドから「messageForBot」を呼び出したい...また、バックグラウンドスレッドはメインスレッドでメソッドを呼び出して通信する必要があります..gManagerオブジェクト内で時間間隔のスリープ....

4

3 に答える 3

23

sleepForTimeInterval が実行されているスレッドをブロックします。別のスレッドで実行して、次のようにサーバーの遅延をシミュレートします。

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
    }); 
});
于 2013-08-15T09:42:12.547 に答える
1

sleepThread というスレッドクラスにメソッドを作成してみてください

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

次に、メインスレッドからスリープさせる

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

ボット スレッドからメイン スレッドに更新を送信するには。

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

サイドノート

RunLoopを作成するには、あなたがする必要があるのはそれだけだと思います

// Run the Current RunLoop
[[NSRunLoop currentRunLoop] run];
于 2013-08-15T11:41:03.140 に答える
0

迅速:

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
    })
}
于 2016-05-05T14:17:57.890 に答える