Closed ooyamatakehisa closed 1 year ago
https://github.com/Stateで持ってるタイマーの参照以外の余分なタイマーがinvalidateされていないのが原因かとも思ったが、余分にタイマーが追加されているようにも見えない。
個人的にはこれが原因としてありそうな気がしました.... このコードでも以下のような条件分岐を行なってisValidの場合は念の為invalidateするような実装にすれば重複してRunLoopに入ることは防げそうな気がしました。
if let recognizedResultsScrollTimer {
if recognizedResultsScrollTimer.isValid { return }
}
@shibukazu 確かに書いといて損はないし、一応下のやつ足しとくわ!
if let recognizedResultsScrollTimer {
if recognizedResultsScrollTimer.isValid { return }
}
Related Issue
226
What
226 を治そうと色々やってみたのですが、simulatorでは再現できず、すこし怪しいけどおそらく関係ないところに関するPRです
Memo
226 に関して、ミニプレイヤーで一時停止ボタンを押して、ボタン表示がちゃんと変わるということは、
RecordingController
のstopAction
は正しく実行されている。stopAction
の実態は親ViewのRecognitionPane
で定義されているpauseRecording
で、この中でタイマーの停止等もされているはず。なのにおそらく、波形を更新するタイマーと時間を更新するタイマーが止まっていない。つまり、以下の
isPaused = true
までは実行されてるから、ボタン表示はちゃんと切り替わってる。なのにそれ以降の行が実行されていない。Timer
のinvalidate
メソッドのドキュメントを読むと、タイマーが設定された場所と同じスレッドでinvalidate
を実行しないといけないと書いてるが、これもすべてメインスレッドで行われている。別の可能性として、タイマーが余分に何個も作成されてRunLoop
に追加されていて、@Stateで持ってるタイマーの参照以外の余分なタイマーがinvalidate
されていないのが原因かとも思ったが、余分にタイマーが追加されているようにも見えない。isAmps
リストが初期化されてしまうのが問題で、本来リストは@StateObjectとかで持たせるべきなので、これも同様の原因かもしれない。277