iOS の UIKit はスレッドセーフではありません。この事実は周知の事実と言えます。私はルールを知っています、私は注意していますが、それでも噛まれます - そして時々結果として生じるクラッシュは、UIKit への問題のバックグラウンド呼び出しから十分に離れており、問題を追跡することは楽しい経験ではありません.
この問題は簡単に解決できるようです。少なくともデバッグ機能として、UIKit クラス/メソッドがバックグラウンド スレッドから呼び出されたときに警告するようにします。私の知る限り、iOS にはそのような機能はありません。もちろん、何らかの形式のアサーションをそのような呼び出しの前に配置することで、同じ効果を手動で達成することもできますが、この解決策は最も洗練されたものではなく、さらに元の問題と同じ弱点、つまりプログラマーが物忘れしやすいという弱点があります。
誰もがよりエレガントなソリューションを持っていますか? プロジェクトでこの問題にどのように対処しますか?
(注:この質問は関連していますが、それほど明確ではありません。不思議に思っています)
更新:アンドリューの答えは、当時私が探していたソリューションですが、少なくともXcode 9の時点では、これは現在xcode/iosによって提供されていることに注意してください。たとえば、次のコードを追加します。
DispatchQueue.global().async {
print(self.view.frame)
}
UIView の viewDidLoad メソッドが Xcode でランタイム警告インラインを生成するには、UIView.frame をメイン スレッドからのみ使用する必要があり、メッセージがコンソールに出力されます:メイン スレッド チェッカー: バックグラウンド スレッドで呼び出される UI API: -[UIView フレーム]