メソッドの遅延呼び出しはプロジェクト開発でよく使用されます。特定の呼び出しシナリオについては詳しく説明しません。いくつかの既存の実装を以下に示します。方法:
##方法1:PerformSelector 非ブロッキング実行モードは他のプロセスに影響しません。メインスレッドで実行する必要があります; 操作を積極的にキャンセルできます:
[self performSelector:@selector(delayMethods) withObject:nil afterDelay:1.0];
現在のすべての遅延操作をキャンセルしたい場合:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delayMethods) object:nil];注: この方法は十分に安全ではありませんこのメソッドは、呼び出されたときに現在の実行ループにタイマーを設定します。ただし、実行ループを自動的に実行し、作成時にデフォルトでタイマーが含まれるのはメイン スレッドだけであることがわかっており、通常の子スレッドには実行ループとタイマーがありません。
したがって、サブスレッドで呼び出される場合、コード内の遅延オペレーション コードは常にタイマーがスケジュールされるまで待機しますが、実際にはサブスレッドにはタイマーがないため、遅延が発生します。アクション コードは決して実行されません。
メソッド 2: NSTimer
[NSObject cancelPreviousPerformRequestsWithTarget:self];
分析: このメソッドは、他のプロセスに影響を与えないノンブロッキング実行メソッドです。メイン内 スレッドで実行されます。デフォルトでは、メイン スレッドにタイマーが設定されます。遅延操作を繰り返すかどうかを設定できます。
遅延操作をキャンセルします:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(delayMethods) userInfo:nil repeats:NO];
注意: 繰り返しパラメータが NO に設定されている場合、タイマーは実行完了後に自動的に破棄されます。繰り返しパラメータが YES に設定されている場合、実行完了後、[タイマー無効化] タイマーを破棄するには手動で呼び出す必要があります;
メソッド 3: sleep
[timer invalidate];
分析: このメソッドはブロック実行メソッドです。子スレッドで実行するのが最善です。そうしないと、他のメソッドの実行に影響します。
メソッド 4: GCD
[NSThread sleepForTimeInterval:1.0];
分析: このメソッドは、他のプロセスに影響を与えないノンブロッキング実行メソッドです。パラメータで指定した実行処理を設定します:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self delayMethods]; });
繰り返し実行するかどうかも設定できます:
dispatch_queue_t queen = dispatch_get_global_queue(0, 0); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), queen, ^{ [self delayMethods]; });
注意: このメソッドはは GCD によって自動的に処理されるため、操作をキャンセルするのは簡単ではありません
以上がiOS 向けのいくつかの遅延実行方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。