-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
<3주차> UIKit 클래스들을 다룰 때 꼭 처리해야하는 애플리케이션 쓰레드 이름은 무엇인가? #16
Comments
Main Thread 이유UIApplication의 인스턴스가 main thread에 붙고(attach) 앱의 UI event는 일반적으로 UIApplication -> UIWindow -> UIViewController -> UIView -> subviews (UIButton 등)와 같이 chain으로 연결되는데, 이 responder chain을 따라 UIResponder로 전달 Responder는 버튼 누르기, 탭, pinch, 확대/축소, 스와이프 등의 이벤트를 UI 변경사항으로 처리합니다. 따라서 이러한 일련의 event chain이 UIKit의 main thread에서 작동하는 이유임. UIKit 정의Use UIKit classes only from your app’s main thread or main dispatch queue, unless otherwise indicated. This restriction particularly applies to classes derived from UIResponder or that involve manipulating your app’s user interface in any way.
UIKit는 thread safe하지않음 |
Main Thread
어플리케이션 UI 이벤트는 왜 main.sync는 동작하지 않을까?
하지만 직접 왜 main queue만 작동되지 않을까? thread-safe는 말 그대로 thread로부터 보호하는 것이다. 결론적으로 UIKit이 main thread에 attach 되어 있으면 concurrent 프로그램을 작성하고 UIKit을 사용하는 것이 쉽다. |
UIkit은 항상 Main Thread 에서 작동되어져야합니다.This restriction particularly applies to classes derived from UIResponder or that involve manipulating your app’s user interface in any way. Cocoa Touch 앱에서 UIApplication의 인스턴스가 main thread에 Attach되기 때문이며, UIApplication은 앱을 시작할 때 인스턴스화 되는 앱의 첫번째 부분이다. 이러한 다양한 터치 이벤트와 gesture를 사용자에게서 항상 즉각적으로 받아내고, 메인 루프를 돌면서 UI적 요소를 그릴려면 성능도 좋아야 하며 오버 헤드(처리시간)도 작아야 한다. (그만큼 처리해야할 연산과 event가 많으므로) 따라서 애플은 Main Thread에서 safe하지 않게 함으로서 이러한 구조를 디자인 했다. (쓰레드가 safe하면 성능과 오버헤드가 증가) |
Main ThreadCocoa Touch 앱에서는 UIApplication의 인스턴스가 main thread에 붙기 때문입니다. UIApplication은 앱을 시작할 때 인스턴스화 되는 앱의 첫번째 부분인데 앱의 run loop를 포함하여 main event loop를 설정하고 event 처리를 시작합니다. 앱의 main even loop는 touch, gesture등의 모든 UI Event를 수신합니다. 앱의 UI Event는 일반적으로 UIApplication -> UIWindow -> UIViewController -> UIView -> subviews 와 같이 chain으로 UIResponder로 전달됩니다. Responder는 버튼 누르기, 탭, pinch, 확대/축소, 스와이프 등의 이벤트를 UI 변경사항으로 처리합니다. 따라서 이러한 일련의 event chain이 UIKit이 main thread에서 작동하는 이유입니다. |
답 : Main Thread. https://developer.apple.com/documentation/uikit/1622933-uiapplicationmain UIApplication(), 즉 애플리케이션 인스턴스는 CocoaTouch의 진입함수인 UIApplication()에 의해 생성되므로 메인 스레드에 붙여집니다(attach). 이는 메인 스레드를 사용하는 메인 이벤트 루프를 셋업하며, 이벤트 처리를 시작합니다. 또, UI 이벤트는 일반적으로 UIApplication-> UIWindow-> UIViewController-> UIView-> subviews (UIButton 등)와 같은 응답자 체인을 따라 UIResponder에 전달됩니다. Responder는 UI의 변경으로 번역되는 버튼 누름, 탭, 핀치 줌, 스 와이프 등과 같은 이벤트를 처리합니다. 따라서 이러한 일련의 이벤트가 메인 스레드에서 발생하는 것을 볼 수 있으므로 UIKit, 응답자를 포함하는 프레임 워크가 메인 스레드에서 작동해야합니다. UIKit 문서를 보자 아래쯤에 누가봐도 중요해보이는 노란색 문장을 읽어보자아 만약 다르게 명시되지 않는다면 UIKit은 당신의 앱의 메인 디스패치 큐에서만 사용하세염 |
Main ThreadUIKit은 Thread-safe 하지 않습니다. 그래서 모든 처리를 Serial 하게 처리해야 합니다. 그래서 UI는 Main Thread 에서 synchronously 하게 동작해야 합니다.
그리고 많은 background thread 에서 UI를 update 하게 되면 각각의 스레드가 서로 다른 rendering 정보를 처리하기 때문에 많은 transaction 을 처리해야 합니다. 이러한 rendering 은 GPU가 처리할 수 없는 transaction 의 한계를 넘게 됩니다. 앱의 UI event는 일반적으로 UIApplication -> UIWindow -> UIViewController -> UIView -> subviews (UIButton 등)와 같이 chain으로 연결되는데, 이 responder chain을 따라 UIResponder로 전달됩니다. Responder는 버튼 누르기, 탭, pinch, 확대/축소, 스와이프 등의 이벤트를 UI 변경사항으로 처리합니다. 따라서 이러한 일련의 event chain이 UIKit의 main thread에서 작동하는 이유입니다. |
No description provided.
The text was updated successfully, but these errors were encountered: