在全局异步闭包中,我想在主线程上初始化UIView
。我认为这段代码可能会这样做,但我得到一个分析器警告:
UIView.init(frame:)
必须仅从主线程中使用。
let view: UIView = { // Line with the warning
DispatchQueue.main.sync {
return UIView()
}
}()
答案 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
,它会为您提供一个独立的帖子