2017-02-27 5 views
0

私は、私はあなたがいずれかを持っていることを願って自分自身に質問をしますが、まだ答えを持っていない:performSelector: "スリープ"スレッドの現在の実行ループを呼び出した結果?

「睡眠」状態(まあ、中(例えばrunLoop1を命名)NSRunLoop彼の現在を持っNSThreadがある場合に何が起こりましたrunLoop1[NSThread sleepForTimeInterval:/*...*/]と呼ばれています)、他の1つはです。[self performSelector:@selector(selector:) onThread:runLoop1 withObject:nil waitUntilDone:NO]?私は実行ループ^^

+0

'sleepForTimeInterval'は、そのスレッドを完全にブロックします。 [ドキュメンテーション](https://developer.apple.com/reference/foundation/thread/1413673-sleep)のように、「スレッドがブロックされている間、ループ処理が実行されません」と記載されています。このため、実稼働中のコードでは 'sleepForTimeInterval'をめったに望んでいません。 – Rob

答えて

1

理解できるよ願ってい

は無限ループのように説明することができます。

while(!exit) { 
    // Do stuff here 
} 

は、これは、スレッド上で実行され、このスレッドがスリープ状態の場合はそのようにループがありますイベントは呼び出されません。

が適切に実行されることをループで呼び出しの配列があると想像:

それではperformSelector方法は何ですか。遅延の後にセレクタを実行する方法があるので、タイムスタンプもある。

while(!exit) { 
    NSMutableArray *notExecuted = [NSMutableArray new]; 
    for(Executable *item in [self.pendingExecutables copy]) { 
     if(item.executionDate && [item.executionDate compare:[NSDate date]] == NSOrderedDescending) { 
      [notExecuted addObject:item]; 
     } 
     else { 
      [item execute]; 
     } 
    } 
    self.pendingExecutables = notExecuted; 
} 

したがって、performSelectorを呼び出すと、それを実行するために必要なデータが何らかの配列に追加されます。実際に実行するには、実行ループが実行されている必要があります。あなたのケースでは何も起こりません、スレッド全体がスリープしているので、ループが実行されていないので、セレクタは実行されません。

また、メインスレッドをブロックするとどうなるかを理解することができます。タッチイベントなし、システム通知なし、何もありません。すべてが配列に保持され、スレッドがブロック解除され、別のループが発生すると呼び出されます。また、メインループは、各サイクルで日付を送信し、ウォッチドッグに使用されます。 OSは別のスレッドで動作しているため、アプリケーションはその日付をチェックするOSであり、比較的古くなっている場合は「アプリケーションが応答していない」状態になります。そしてOSはあなたのアプリケーションを殺すことを決定するかもしれません。

これは単純化されていますが、これらのことがどのように機能するかを基本的に理解するだけで十分です。

+0

あなたの答えをありがとう。宛先スレッドのスリープ中にスキップされたイベントはどうなりましたか?スレッドが起きているか、無視されたときに処理されますか? – N0un

+0

スレッドが実行ループを持っている限り、スレッドが起動すると処理されます。呼び出しスレッドが実行スレッドと同じ場合、スキップされる方法があります。それが起こったケースがありますか? –

+0

特に、私はこれらのオブジェクトで作業しているので、私は疑問に思っていました。 – N0un

関連する問題