2013-08-15 5 views
15

サーバとの通信をシミュレートしたい。リモートサーバが、私はそれNSThread sleepfortimeintervalブロックメインスレッド

[NSThread sleepForTimeInterval:timeoutTillAnswer]; 

スレッドNSThreadサブクラス分けを使用して作成して開始された上で持っているバックグラウンドスレッドを使用するいくつかの遅延を持つことになりますよう...しかし、私はsleepForTimeIntervalは、メインスレッドをブロックしていることに気づきました。 .. なぜ??? NSThreadはデフォルトでbackgroundThreadですか?

これは、スレッドが作成される方法です。

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

さらに詳細: これはボットスレッドsubclasある

- (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オブジェクトの内部で行われます....

+0

ショー、それは何をし、 'sleepForTimeInterval:'(これは現在のスレッドを遅らせますそれが呼ばれた時)。 – Wain

+0

これは私がスレッドを作成する方法です... [self.botThread start]; ...それは、NSThreadサブクラスPSBotThreadメインメソッドを呼び出します。 – user1028028

+0

しかしそれは何をしますか? 'sleepForTimeInterval'はどこにありますか? – Wain

答えて

22

任意のスレッド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 
    }); 
}); 
+0

これはうまくいかないと思います...おそらくスレッドcreatoinはdispatch_asyncにあるはずですか? – user1028028

+0

私はそれを使用しており、それは正常に動作します。私はネットワークレイテンシをシミュレートするために同じことをしました。 dispatch_queue_createはすでに別のスレッドを作成しています。 dispatch_async内のsleepForTimeIntervalは、そのスレッドをスリープさせます。 – John

+0

それは私のためにも働いています:-) – Donald

1

それはあなたのメインスレッドから

[self.botThread performSelector:@selector(sleepThread) onThread:self.botThread withObject:nil waitUntilDone:NO]; 
を眠りにするためにその後sleepThread

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

と呼ばれる自分のスレッドクラスのメソッドを作成して試してみてください

あなたのボットスレッドからメインスレッドに更新情報を送信します。

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

側注

私はあなたがする必要があるすべてはスウィフト

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

私はそれをメインスレッドからスリープさせる必要はありません...メインスレッドからメッセージを受け取った後でスリープ状態にする必要があります – user1028028

+0

これでメソッド内でスリープ状態にしたいので、 - (void)messageForBot:(NSData *)msg? – sbarow

+0

いいえ、そのメソッドは、メインメソッドで作成された内部オブジェクトの1つで別のメソッドを呼び出します...そこにはスリープ状態にする必要があります...今のようなUIをブロックすることなく – user1028028

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 
    }) 
} 
関連する問題