理解できるよ願ってい
は無限ループのように説明することができます。
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はあなたのアプリケーションを殺すことを決定するかもしれません。
これは単純化されていますが、これらのことがどのように機能するかを基本的に理解するだけで十分です。
'sleepForTimeInterval'は、そのスレッドを完全にブロックします。 [ドキュメンテーション](https://developer.apple.com/reference/foundation/thread/1413673-sleep)のように、「スレッドがブロックされている間、ループ処理が実行されません」と記載されています。このため、実稼働中のコードでは 'sleepForTimeInterval'をめったに望んでいません。 – Rob