0

글로벌 비동기식 클로저에서 기본 스레드에서 UIView을 초기화하고 싶습니다. 이 코드는 아마도 그것을 할 것이라고 생각하지만, 나는 분석기 경고 얻을 : 오직 주 스레드에서 사용하여백그라운드 스레드에서 메인 스레드의 UIView 초기화

UIView.init(frame:)해야합니다.

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

그런 일을하는 목적은 무엇입니까? 일반적인 목표가 무엇인지 말씀해 주시겠습니까? –

+0

일부 xib에서 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

완료 핸들러를 사용하면 더 깨끗합니다. 기술적으로, 어쨌든 두 개의 함수로 나누는 것이 좋습니다. – Sulthan

+0

@ 설화, 동의합니다. 내 코드는 '모범 사례'표준이 아니었지만 예상대로 실행해야합니다. – DanielH

0

그런 일을 시도 .async, 독립 스레드 제공

관련 문제