2017-01-06 2 views
0

私はオブジェクトのプロパティを変更した後にDispatchQueue.main.asyncAfterメソッドを呼び出します(私はKVOでファイアしています)。私は1秒間だけ確認画面を表示していますし、UI上で別のことをするブロックを実行します(viewcontrollerをポップします)。問題は、私がUICollectionViewCellからこれを呼び出すときにうまく動作しますが、私のアプリケーションで別のUICollectionViewCellからこのメソッドを呼び出すと、フリーズします。このメソッドは、UIViewという拡張子で実装されています。DispatchQueue.main.asyncAfterメソッドは特定の呼び出しでUIをフリーズします

Dispatch内のコードがフリーズすると、私は中にブレークポイントがありますが、そのポイントには到達しません。私は実行を一時停止するとき

UDPATE ここでスタックトレースです:

First time I paused the execution

+2

あなたのアプリがフリーズしたら、デバッガの一時停止ボタンをクリックし、スタックトレースを見て、あなたのアプリがスタックしていることを確認します。 – rmaddy

+0

実行を一時停止すると、スタックトレースのスクリーンショットが追加されました。しかし、もし私が演奏を押して再び一時停止すると、必ずしも同じポイントではありません。 – sheinix

答えて

0

私はこのトリッキーなバグを解決しました。まず、DispatchQueue.main.asyncAfter呼び出しに問題はありませんでした。アプリはループに入り、ロックされた兆候はなかった。私はプロファイラを実行し、いくつかの制約のレイアウトが繰り返し呼び出されているのを見ました。私はcollectionViewCellの中にtableViewを持ち、asyncAfterの呼び出しを終えるとアニメーションを持っています。問題は、オーバーライドされたメソッドlayoutSubviewsにはtableView.reloadData()が内部にあるため、アニメーションを使用して非同期呼び出し後に終了しようとするたびに、layoutsubviewsが呼び出され、reloadData()が繰り返しトリガーされたことです。なぜreloadDataがそこにあったのか分かりませんが、今は正常に動作しているようです。

関連する問題