2

ゲームを作成していますが、ゲーム内でタイム カウンターを取得する必要があります。

私はうまく機能しますが、マップをスクロールすると停止し、スクロールが終了すると再び開始します。これは、dispatch_async で修正します。ここにコードがあります

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self  selector:@selector(timeNext) userInfo:nil repeats:NO];

                [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

                [[NSRunLoop currentRunLoop] run]; 
            });

タイマー:

__block NSTimer *timer;

ただし、アプリがバックグラウンドになった場合は、今回は停止する必要があります (アクティブになると、再び開始されます)。

このようにして、マップをスクロールでき、タイマーがうまく機能します。

- (void)timeNext {
    [timer invalidate];
    }

そしてうまくいきませんでした。誰でもそれを止める方法を知っていますか? またはこのタスクを達成するための他のアイデアはありますか?

4

3 に答える 3

4

グローバル キューのスレッドでタイマーを作成してから、そのスレッドで実行ループを開始しないでください。

メイン スレッド (メイン実行ループ) でタイマーを作成し、それを追跡実行ループ モードに追加するだけです。タイマーは、複数の実行ループ モードに追加できます。

timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self  selector:@selector(timeNext) userInfo:nil repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
于 2013-04-18T04:56:47.880 に答える
0

NSRunLoopCommonModesの代わりに使用UITrackingRunLoopModeします。すべてが正常に見えます。メイン スレッドの ui 操作はtick機能をブロックしなくなります。

NSTimer* timer = [NSTimer timerWithTimeInterval:1./60. target:self selector:@selector(tick) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
于 2015-05-26T06:04:06.347 に答える