작성
·
195
1
안녕하세요. 레이아웃편과 퍼팩트가이드 두편 모두 보며 많이 배우고 있습니다.
질문이있는데요 UI 변경 관련 코드는 DispatchQueue.main.dasync { } 코드 안에 작성하라고 하셨는데
대체 UI 변경이란게 어떤걸 의미하는지 자세히 모르겠습니다. 간단한 뷰의 위치이동이나 색 변경 등등은 저 코드 안에 작성 안해도 오류가 나지않는 반면 self.scrollView.setContentOffset(CGPoint(x: self.onulhalin.frame.minX - 60 ,y: 0), animated: true 이런 코드는 저 코드 안에 넣지 않으면 오류가 나더라구요. 대체 UI 관련 코드라는게 정확히 어떤 행위를 의미하는건가요?er
adasdd {
답변 3
1
안녕하세요.
우선 thread에는 main thread와 background(혹은 다른)thread의 구분이 있습니다.
우리가 만드는 코드는 기본적으로 메인스레드에서 동작되도록 되어 있습니다.
따라서 일반적인 로직에서는 main async안에 넣지 않아도 UI업데이트는 바로 됩니다.
그런데 메인스레드가 아닌 상황은 클로저 안에 있을경우, 다른 스레드를 만들었을 경우입니다.
이 안에서 UI변경을 하면 운좋으면 매우 느리게(몇십초) 반응하거나 크래쉬가 납니다.
main thread가 아닌 경우 UI변경을 하면 안되거나 크래쉬가 나는 이유는 아래와 같습니다.
UIApplication이라는게 있는데 이건 앱의 Main RunLoop를 관리하고 UI 이벤트 같은걸 관리하도록 만들어진 녀석입니다.
쉽게말해 앱이 동작되기 위해 event와 UIKit을 관리하는게 이것이라고 생각하면 될듯합니다.
근데 이 UIApplication라는게 main thread에서"만" 생성되고 동작하도록 설계되어 있습니다.
이건 빠른 퍼포먼스, 낮은 자원사용, 충돌등의 많은 문제등을 해결하기 위한 애플의 의도된 설계입니다.
때문에 UI 이벤트(변경)은 main thread에서 해야 UIApplication이 제대로 UI변경을 처리할 수 있다고 보면 될 것 같습니다.
0
안녕하세요
클로저 안이라는 표현은 클로저 구현 부분 라고 이해하시면 될 것 같습니다.
클로저에서 in 다음 부분을 말하는거죠.
xxx { _ in
// 여기가 클로저 구현 부분
}
우리가 흔히 사용하는 화면을 present하는 completion 부분을 생각하시면 될 것 같습니다.
self.present(xxxVC, animated: false) {
// 여기가 클로저 구현 부분
}
DispatchQueue.global().async {
// 여기는 main thread가 아님.
}
0
답변 정말 감사합니다. 근데 약간 이해가가지않는 부분이 생겨 다시질문드립니다.
그런데 메인스레드가 아닌 상황은 클로저 안에 있을경우, 다른 스레드를 만들었을 경우입니다. << 이렇게 답변 주셨는데 여기에서 클로저 안에 있는 경우는 이해가갔는데 다른스레드를 만들었을 경우가 언제인지 궁금합니다. 다른스레드가 제가 만든것인지 아니면 자동으로 만들어진건가요? 혹시 클로저 안에 있는 경우와, 다른 스레드를 만들었을 경우 예제 코드가 있을까요?