从后台线程初始化主线程中的UIView

时间:2017-10-30 14:11:21

标签: swift multithreading grand-central-dispatch dispatch-async background-thread

在全局异步闭包中,我想在主线程上初始化UIView。我认为这段代码可能会这样做,但我得到一个分析器警告:

  

UIView.init(frame:)必须仅从主线程中使用。

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

2 个答案:

答案 0 :(得分:2)

如果您发布更多代码,我将会有所帮助,以便我们更好地理解上下文。 无论如何,这应该很好地工作:

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)
            }
        }
    }
}

我希望有所帮助。

答案 1 :(得分:0)

尝试类似的东西:

您可以继续使用自己的实施,而不使用DispatchQueue.main.sync

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

但是你可以随时回到主线程:

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

使用.async,它会为您提供一个独立的帖子