NS 기본 실행 루프 모드 대 NS 실행 루프 공통 모드
뒤에 있는 큰 파일을 다운로드하려고 할 때마다UIScrollView
,MPMapView
iPhone 화면을 터치하면 바로 다운로드가 중지됩니다.고맙게도, Jörn의 멋진 블로그 게시물은 다음을 사용하여 대안을 제시합니다.NSRunLoopCommonModes
연줄로
그러면 NSDefaultRunLoopMode와 NSRunLoopCommonMode라는 두 가지 모드에 대해 자세히 알아보게 되지만, 애플 문서는 다음과 같은 것 외에는 친절하게 설명하지 않습니다.
NS 기본 실행 루프 모드
NS 연결 개체 이외의 입력 소스를 처리하는 모드입니다.가장 일반적으로 사용되는 실행 루프 모드입니다.
NSRunLoop 공통 모드
이 값을 모드로 사용하여 실행 루프에 추가된 개체는 "공통" 모드 집합의 구성원으로 선언된 모든 실행 루프 모드에서 모니터링됩니다. 자세한 내용은 CFRunLoopAddCommonMode의 설명을 참조하십시오.
CFRunLoop 추가 공통 모드
소스, 타이머 및 관찰자는 하나 이상의 실행 루프 모드에 등록되고 실행 루프가 이러한 모드 중 하나에서 실행 중일 때만 실행됩니다.공통 모드는 이러한 모드에서 공유하는 소스, 타이머 및 관찰자 세트를 정의할 수 있는 실행 루프 모드 집합입니다.예를 들어, 소스를 각 실행 루프 모드에 등록하는 대신, 실행 루프의 공통 유사 모드에 한 번 등록할 수 있으며, 공통 모드 세트의 각 실행 루프 모드에 자동으로 등록됩니다.마찬가지로 모드가 공통 모드 집합에 추가되면 공통 유사 모드에 이미 등록된 모든 소스, 타이머 또는 관찰자가 새로 추가된 공통 모드에 추가됩니다.
누가 그 두 가지를 인간의 언어로 설명해 줄 수 있습니까?
실행 루프는 시스템이 절전 스레드를 깨워서 비동기 이벤트를 관리할 수 있도록 하는 메커니즘입니다.일반적으로 스레드를 실행할 때(메인 스레드 제외) 실행 루프에서 스레드를 시작할지 여부를 결정하는 옵션이 있습니다.스레드가 외부 이벤트와 상호 작용하지 않고 타이머 없이 일종의 정렬 또는 장시간 실행 작업을 실행하는 경우에는 실행 루프가 필요하지 않지만, 들어오는 이벤트에 응답해야 하는 스레드가 있으면 새 이벤트가 도착할 때 스레드를 깨우기 위해 실행 루프에 연결해야 합니다.이 이경는의 입니다.NSURLConnection
생성된 스레드는 (네트워크에서) 들어오는 이벤트에서만 깨우기 때문입니다.
각 스레드는 여러 실행 루프에 연결되거나 다른 모드에서 작동하도록 설정할 수 있는 특정 실행 루프에 연결될 수 있습니다.실행 루프 모드는 특정 이벤트를 전달하거나 나중에 전달할 이벤트를 수집하는 시기에 대한 일부 규칙을 설정하기 위해 OS에서 사용하는 규칙입니다.
일반적으로 모든 실행 루프는 입력 이벤트를 관리하는 기본 방법을 설정하는 "기본 모드"로 설정됩니다.예를 들어, 마우스 끌기(Mac OS) 또는 터치(iOS) 이벤트가 발생하는 즉시 이 실행 루프의 모드가 이벤트 추적으로 설정됩니다. 즉, 스레드는 새 네트워크 이벤트에서 깨지 않지만 사용자 입력 이벤트가 종료되고 실행 루프가 기본 모드로 다시 설정될 때 나중에 이러한 이벤트가 전달됩니다.는 백그라운드 이벤트 대신 사용자 이벤트에 우선 순위를 부여하기 위해 OS 설계자가 선택한 것입니다.
이 당신의 런 .NSURLConnection
레드, 사용을 scheduleInRunLoop:forModes:
그런 다음 스레드를 특정 기본 실행 루프가 아닌 특수 실행 루프 모드에 할당할 수 있습니다.특별한 유사 모드는 다음과 같습니다.NSRunLoopCommonModes
이벤트 추적을 비롯한 여러 입력 소스에서 사용됩니다.를 들어 당할예 할당NSURLConnection
의 인스턴스를 공통 모드로 연결하면 이벤트가 "기본 모드" 외에 "기본 모드"에도 연결됩니다.스레드를 연결할 때의 한 가지 장점/단점NSRunLoopCommonModes
는 터치 의해 입니다.즉, 터이벤트의해스레드가차단지않되습니다치에,▁is않▁will습니다지▁thread즉되▁that차▁events단▁the.
공통 모드에 새 모드를 추가할 수 있지만 이는 상당히 낮은 수준의 작업입니다.
마지막으로 몇 가지 참고 사항을 추가하겠습니다.
일반적으로 네트워크에서 다운로드한 이미지 또는 미리 보기 세트를 테이블 보기와 함께 사용해야 합니다.테이블 보기가 스크롤되는 동안 네트워크에서 이러한 이미지를 다운로드하면 사용자 환경이 개선될 수 있다고 생각할 수 있지만(스크롤하는 동안 이미지를 볼 수 있기 때문에) 스크롤의 유동성이 크게 저하될 수 있으므로 이점이 없습니다.이 예제에서는 다음을 사용합니다.
NSURLConnection
하면 안 됩니다. 런 루프를 하는 것이 . 사용하는 것이 더 나을 것입니다.UIScrollView
에서 새 합니다.실행 루프 관리 문제로부터 코드를 "보호"하는 데 도움이 되는 GCD 사용을 고려할 수 있습니다.위의 예에서는 사용자 지정 직렬 대기열에 네트워크 요청을 추가하는 것을 고려할 수 있습니다.
언급URL : https://stackoverflow.com/questions/7222449/nsdefaultrunloopmode-vs-nsrunloopcommonmodes
'programing' 카테고리의 다른 글
요청이 중단되었습니다.SSL/TLS 보안 채널을 생성할 수 없습니다. (0) | 2023.06.14 |
---|---|
Are digraphs and trigraphs in use today? (0) | 2023.06.14 |
x 및 y 배열 점을 2D 점의 단일 배열로 데카르트 곱 (0) | 2023.06.14 |
TSLint: 누락된 공백 제거 (0) | 2023.06.14 |
왜 Ruby는 i++ 또는 i--(증분/감분 연산자)를 지원하지 않습니까? (0) | 2023.06.09 |