1

UILabel に値が表示されたカウントダウンを実装していますが、問題が発生しました。簡略化されたコードは次のとおりです。

self.countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countdown) userInfo:nil repeats:YES];

- (void)countdown {          
     self.countdownLabel.text = [NSString stringWithFormat:@"%i",[self.countdownLabel.text intValue]-1];

     // Handle time out
     if ([self.countdownLabel.text intValue] == 0) {
             [self.countdownTimer invalidate];
             self.countdownTimer = nil;
     }
}

それは正常に動作しますが、スクロールビューのスクロールなど、ビューコントローラーで他のUI操作を行うと、スクロールビューがスクロールするとタイマーがハングし、アイドル状態の瞬間を補うためにブーストします。

ラベルの更新をバックグラウンド キューにディスパッチしてみましたが、もちろんうまくいきませんでした。

dispatch_queue_t bgQ = dispatch_queue_create("bgQ", 0);
dispatch_async(bgQ, ^{
    self.countdownLabel.text = [NSString stringWithFormat:@"%i",[self.countdownLabel.text intValue]-1];
});

ここでの解決策は何ですか?

4

2 に答える 2

1
self.countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countdown) userInfo:nil repeats:YES];    
[[NSRunLoop mainRunLoop] addTimer:self.countdownTimer forMode:NSRunLoopCommonModes];

countdownメソッドでは、countdownTimerを無効にするためのエスケープが必要であることを忘れないでください。

タイマーは、発砲命令なしで開始します。

[[NSRunLoop mainRunLoop] addTimer:self.countdownTimer forMode:NSRunLoopCommonModes];

行が実行されます。UI変更のディスパッチ非同期は絶対にありません。

お役に立てれば。

于 2013-03-10T11:10:17.610 に答える
1

Swift 3.0 構文

var timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ViewController.updateTimer), userInfo: nil, repeats: true);
RunLoop.current.add(timer, forMode: RunLoopMode.commonModes)
于 2017-06-02T09:52:16.980 に答える