13

遅延後にアプリケーションにアクションを実行させようとしていますが、ユーザーがを操作/スクロールしている間に実行する必要がありますUIScrollView

performSelector:withObject:afterDelayなぜどちらも発砲しないのか、発砲するのかわかりませんscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:。バックグラウンドスレッド上にあるからですか?

何か提案や助けはありますか?

4

3 に答える 3

24

NSTimerperformSelector: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ます。

于 2012-06-28T21:07:41.233 に答える
4

で遅延トリガーが発生することを確認してください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#>
});
于 2013-05-15T08:06:39.087 に答える
0

スイフトの場合:

performSelector(#selector(fire:), withObject: sender, afterDelay: 1.0, inModes: [NSRunLoopCommonModes])
于 2016-07-22T09:56:38.260 に答える