0

グローバルな非同期クロージャでは、メインスレッドのUIViewを初期化したいと考えています。私は、このコードはおそらくそれを行うだろうと思ったが、私はアナライザの警告を取得:メインスレッドからのみ使用によってバックグラウンドスレッドからのメインスレッドのUIViewの初期化

UIView.init(frame:)必見。

let view: UIView = { // Line with the warning 
     DispatchQueue.main.sync { 
      return UIView() 
     } 
}() 
+0

そのようなことをする目的は何ですか?あなたの一般的な目標は何ですか? –

+0

私はいくつかのxibsからPDFを生成しています。私はそれらのためのコンテナが必要です。これは、警告を出す唯一の行です。 –

+0

私はこれが奇妙だと思います!あなたは 'DispatchQueue.main.sync'なしで試していますか?なぜこれが必要ですか? – Mannopson

答えて

2

私たちはより良いコンテキストを理解できるように、uは、コードの多くを投稿する場合、私は役に立つことでしょう。 とにかく、これはうまく動作するはずです:

class SomeViewController: UIViewController { 

    private var customView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     setupCustomView() 
    } 

    private func setupCustomView() { 
     DispatchQueue.global().async { 
      /* 
      1. Do some preperation/data init' on background thread. 
      2. When ready, perform UI dependent initialization on main thread. 
      */ 
      DispatchQueue.main.async { 

       /* Initialize `customView` on the main queue. for example: */ 
       self.customView = UIView() 
       self.view.addSubview(self.customView) 
       self.customView.backgroundColor = .red 
       self.customView.frame = CGRect(x: 0, y: 0, width: 100, height: 100) 
      } 
     } 
    } 
} 

私はそれが役に立てば幸い。

あなたは独自の実装を使用し続けることができ

let view: UIView = { 
     return UIView() 
}() 

DispatchQueue.main.syncのないあなたは、メインスレッドいつに戻って行くことができますしかし:

DispatchQueue.main.async { 
    self.view.addSubview(view) 
} 

使用

+1

補完ハンドラを使用するとよりクリーンになります。技術的には、私はそれを2つの機能に分割することをお勧めします。 – Sulthan

+0

@スルタン、私は同意します。私のコードは「ベストプラクティス」基準ではありませんでしたが、期待通りに実行する必要があります。 – DanielH

0

そのような何かを試してみてください.async、それはあなたに独立したスレッドを提供します

関連する問題