왜 동시성인가?
데이터로드와 같은 무거운 작업을 앱에 추가하자마자 UI 작업 속도가 느려지거나 심지어 멈 춥니 다. 동시성을 사용하면 2 개 이상의 작업을 "동시에"수행 할 수 있습니다. 이 접근법의 단점은 스레드 안전성이 항상 제어하기 쉽지는 않다는 것입니다. Fe는 다른 스레드에서 동일한 변수를 변경하거나 다른 스레드에 의해 이미 차단 된 리소스에 액세스하는 것과 같이 다른 작업이 동일한 리소스에 액세스하려고 할 때입니다.
우리가 알아야 할 몇 가지 추상화가 있습니다.
- 대기열.
- 동기 / 비동기 작업 성능.
- 우선 순위.
- 일반적인 문제.
대기열
연속적 이거나 동시 적 이어야 합니다 . 동시에 글로벌 또는 비공개 .
직렬 대기열을 사용하면 작업이 하나씩 완료되고 동시 대기열로 작업이 동시에 수행되며 예기치 않은 일정에 따라 완료됩니다. 동일한 작업 그룹은 동시 대기열에 비해 직렬 대기열에서 더 많은 시간이 걸립니다.
고유 한 개인 대기열 ( 직렬 또는 동시 )을 만들거나 이미 사용 가능한 전역 (시스템) 대기열을 사용할 수 있습니다 . 주요 큐가 유일하다 시리얼 큐 의 모든 중 글로벌 큐 .
기본 대기열 (네트워크에서 데이터를로드하는 경우)에서 UI 작업을 참조하지 않는 무거운 작업을 수행 하지 말고 다른 대기열에서 수행하여 UI가 고정되지 않고 사용자 작업에 응답하도록하는 것이 좋습니다. 다른 대기열에서 UI를 변경하면 예상치 못한 다른 일정과 속도로 변경 될 수 있습니다. 일부 UI 요소는 필요하기 전이나 후에 그릴 수 있습니다. UI가 충돌 할 수 있습니다. 또한 전역 대기열 은 시스템 대기열 이므로 시스템에서 실행할 수있는 다른 작업이 있음을 명심해야 합니다.
서비스 품질 / 우선 순위
큐는 다른이 의 QoS (서비스 품질) 작업을 수행 설정 우선 순위를 (여기에 가장 낮은에 가장 높은에서) :
.userInteractive - 주요 큐가
.userInitiated을 - 사용자가 시작한 작업하는 몇 가지 응답에 대한 사용자 대기
.utility - 작업에 대한 이는 약간의 시간이 소요 및 데이터 작업 등 즉각적인 대응을 필요로하지 않습니다
.background를 ) 시각적 인 부분과 관련되고 있지 않은 작업 완료 시간에 대한 엄격한하지 않습니다 -. qos 정보를 전송하지 않는 .default 큐
도 있습니다 . 검출 할 수 없었다 경우 QoS를
qos 는 .userInitiated 와 .utility 사이에 사용됩니다 .
작업은 동기식 또는 비동기식 으로 수행 할 수 있습니다 .
일반적인 문제.
프로그래머가 동시 앱을 프로젝션하는 동안 범하는 가장 일반적인 실수는 다음과 같습니다.
- 경쟁 조건 -앱이 작동 할 때 발생하는 코드 부분 실행 순서에 따라 다릅니다.
- 우선 순위 반전 -일부 리소스가 차단되어 우선 순위가 높은 작업이 더 작은 우선 순위 작업이 완료되기를 기다리는 경우
- 교착 상태 -일부 대기열이 이러한 대기열 중 일부에 의해 이미 차단 된 소스 (변수, 데이터 등)를 무한히 기다릴 때.
메인 대기열에서 동기화 기능을 호출하지 마십시오 .
메인 대기열에서 동기화 기능을 호출하면 대기열이 차단되고 대기열이 작업이 완료되기를 기다리고 있지만 대기열이 시작되지 않아 작업을 완료 할 수 없습니다. 이미 차단되었습니다. 교착 상태 라고 합니다.
동기화는 언제 사용합니까?
작업이 끝날 때까지 기다려야 할 때. 일부 함수 / 메서드가 이중 호출되지 않았는지 확인할 때 Fe. Fe 우리는 동기화가 있으며 완전히 완료 될 때까지 이중 호출을 방지하려고합니다. 이 문제에 대한 몇 가지 코드는 다음과 같습니다
. IOS 장치에서 오류 충돌 보고서의 원인을 찾는 방법은 무엇입니까?
DispatchQueue.main.sync
백그라운드 스레드에서 호출하는 것이 잘못 입니까?