Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 커스텀 뷰에서 DispatchQueue.main 사용 시 주의사항 본문

iOS 응용 (swift)

[iOS - swift] 커스텀 뷰에서 DispatchQueue.main 사용 시 주의사항

jake-kim 2023. 9. 29. 01:07

DispatchQueue.main 및 스레드 동작 개념

* 이전 포스팅 글 참고

기본 상식) UI코드와 main thread 

  • UI 코드를 초기화하거나 접근할 때 main thread가 아니면 Xcode에서 디버그 모드에서 crash를 내주며 개발자에게 main thread에서 호출하도록 유도
  • 주의할점은 뷰를 초기화 할 때도 main thread에서 수행이 필수

ex) 뷰를 background thread에서 수행하면 Xcode에서 에러 발생

커스텀 뷰에서의 DispatchQueue.main 사용 시 주의사항

  • 보통 커스텀 뷰를 구현할 때, 뷰 내부 코드에 DispatchQueue.main을 넣는 경우가 존재
    • (외부에서 해당 뷰를 사용할 때 어차피 DispatchQueue.main으로 불러야하니 커스텀 뷰에 DispatchQueue를 넣는 경우)
    • ex) 아래 showSomeAnimation()에서 DispatchQueue.main 사용
class SomeVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    func showSomeAnimation() {
        DispatchQueue.main.async {
            // animation...
        }
    }
}
  • 위와 같이 구현되는 경우가 종종 있지만, 위와 같이 구현했을때 이 뷰를 사용하는 쪽에서는 showSomeAnimation() 코드는 무조건 async로 동작하게되어, sync로 동작하게 하고싶어도 불가능한 상태
  • 때문에 커스텀 뷰를 구현할 때 내부에서 DispatchQueue를 쓰는 것보다 이 커스텀 뷰를 사용하는 쪽에서 DispathcQueue.main을 사용하여 호출하는것이 좋은 코드
class SomeVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    func showSomeAnimation() {
        // animation...
    }
}

let someVC = SomeVC()
DispatchQueue.main.async {
    someVC.showSomeAnimation()
}
Comments