遅延後にアプリケーションにアクションを実行させようとしていますが、ユーザーがを操作/スクロールしている間に実行する必要がありますUIScrollView
。
performSelector:withObject:afterDelay
なぜどちらも発砲しないのか、発砲するのかわかりませんscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
。バックグラウンドスレッド上にあるからですか?
何か提案や助けはありますか?
遅延後にアプリケーションにアクションを実行させようとしていますが、ユーザーがを操作/スクロールしている間に実行する必要がありますUIScrollView
。
performSelector:withObject:afterDelay
なぜどちらも発砲しないのか、発砲するのかわかりませんscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
。バックグラウンドスレッド上にあるからですか?
何か提案や助けはありますか?
NSTimer
とperformSelector:withObject:afterDelay:
デフォルトの両方で、通常の実行ループモードでのみ起動します。スクロールすると、実行ループはイベント追跡モードになります。
すべての一般的なモードで時間指定のアクションをスケジュールする必要があります。
NSTimer *timer = [NSTimer timerWithTimeInterval:0.016 target:self selector:@selector(fire:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
また
[self performSelector:@selector(fire:) withObject:nil afterDelay:1.0 inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
専用もありNSEventTrackingRunLoopMode
ます。
で遅延トリガーが発生することを確認してくださいNSRunLoopCommonModes
。デフォルトではNSDefaultRunLoopMode
、スクロール中などにメッセージを取得しません。
[self performSelector:@selector(fire:) withObject:nil afterDelay:2.0 inModes:@[NSRunLoopCommonModes]];
GCD
または、同じように動作する whichを使用することもできます(使用する実行ループモードがわからない)
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
<#code to be executed on the main queue after delay#>
});
スイフトの場合:
performSelector(#selector(fire:), withObject: sender, afterDelay: 1.0, inModes: [NSRunLoopCommonModes])