Xcode UIView.init(frame:) はメインスレッドからのみ使用する必要があります 質問する

Xcode UIView.init(frame:) はメインスレッドからのみ使用する必要があります 質問する

メイン スレッドに影響を与えないように、バックグラウンド スレッドでいくつかのビューをレンダリングしようとしています。これは、Xcode 9 より前では問題になりませんでした。

DispatchQueue.global(qos: .background).async {
    let customView = UIView(frame: .zero)
    DispatchQueue.main.async {
        self.view.addSubview(customView)
    }
}

UIView.init(frame:) はメインスレッドからのみ使用する必要があります

このエラーは2行目に発生します。

アップデート

AppleのUIViewドキュメントには、スレッドに関する考慮事項セクション:

アプリケーションのユーザー インターフェイスの操作は、メイン スレッドで実行する必要があります。したがって、アプリケーションのメイン スレッドで実行されているコードから UIView クラスのメソッドを常に呼び出す必要があります。これが厳密に必要でない可能性があるのは、ビュー オブジェクト自体を作成するときだけですが、その他のすべての操作はメイン スレッドで実行する必要があります。

ベストアンサー1

Xcode 9には新しいランタイムがありますメインスレッドチェッカーバックグラウンド スレッドからの UIKit への呼び出しを検出し、警告を生成します。

警告を生成してアプリをクラッシュさせないことが目的であることは承知していますが、テスト ターゲットに対してメイン スレッド チェッカーを無効にしてみることもできます。

ここに画像の説明を入力してください

サンプル プロジェクトでこのコードを試してみましたが、デバッガーは問題箇所で一時停止しました (想定どおり) が、アプリはクラッシュしませんでした。

override func viewDidLoad() {
    super.viewDidLoad()

    DispatchQueue.global().async {
        let v = UIView(frame: .zero)
    }
}

おすすめ記事