2

Swift 2.2 と Xcode 7.3 に更新した後、繰り返しの NSTimer の繰り返しが停止しました。

let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(rotate), userInfo: nil, repeats: true)
timer.fire()

セレクターは一度起動すると、ウィンドウが閉じるか最小化されるまで再起動しません。

他の誰か?助言がありますか?

4

3 に答える 3

4

タイマーは常に同じスレッドでスケジュールまたは無効化する必要があります。非同期ブロック内で呼び出している可能性がありますか? メインキューでスケジュールしてみてください:

dispatch_async(dispatch_get_main_queue(), { () -> Void in
    let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(rotate), userInfo: nil, repeats: true)
    timer.fire()
    })
于 2016-04-01T18:25:58.003 に答える
1
func startTimer() {
    let timer = NSTimer(timeInterval: 1, target: self, selector: #selector(MainViewController.updateLabel), userInfo: nil, repeats: true)
    NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
}

これは Swift 2.2 で機能します Apples のドキュメントには、dispatch_async については何も書かれていません。それを使用する理由はありますか...ただ興味があります...まだ学習中です

timerWithTimeInterval:invocation:repeats: または timerWithTimeInterval:target:selector:userInfo:repeats: クラス メソッドを使用して、実行ループでスケジュールせずにタイマー オブジェクトを作成します。(タイマーを作成したら、対応する NSRunLoop オブジェクトの addTimer:forMode: メソッドを呼び出して、手動で実行ループにタイマーを追加する必要があります。)

于 2016-04-01T22:09:11.280 に答える
0
    dispatch_async(dispatch_get_main_queue()) {
        self.timer = NSTimer(timeInterval:1.0, target:self, selector: #selector(self.rotate), userInfo:nil, repeats:true)
        NSRunLoop.currentRunLoop().addTimer(self.timer!, forMode: NSRunLoopCommonModes)
    }

これは、スレッドの問題であり、NSRunLoop 内で適切に追加されていないか、自動的に処理されていません。同じスレッドでこれを手動で行うと修正されました。

ヘルプと推奨事項をお寄せいただきありがとうございます。

于 2016-04-01T19:21:53.427 に答える