DispatchQueue.main.async와 DispatchQueue.main.sync의 차이점
나는 오랫동안 일부 UI 관련 작업을 수행하기 위해 DispatchQueue.main.async를 사용하고 있습니다. 그러나 Swift는 DispatchQueue.main.async 및 DispatchQueue.main.sync를 제공하며 둘 다 메인 큐에서 수행됩니다. 그래서 누구든지 그들 사이의 차이점을 말할 수 있습니까? 그리고 언제 어디서? 미리 감사드립니다.
DispatchQueue.main.async {
self.imageView.image = imageView
self.lbltitle.text = ""
}
DispatchQueue.main.sync {
self.imageView.image = imageView
self.lbltitle.text = ""
}
왜 동시성인가? 데이터로드와 같은 무거운 작업을 앱에 추가하자마자 UI 작업 속도가 있습니다거나 심지어 멈 멈 멈춤 다. 동시성을 사용하면 2 개 이상의 작업을 "동시에"수행 할 수 있습니다. 이 언어의 단점은 기본이 항상 제어하기 쉽지만 않다는 것입니다. Fe는 다른 하나의 동일한 변수를 변경하거나 다른 용도에 의해 이미 차단 된 리소스에 액세스하는 것과 다른 작업이 동일한 리소스에 액세스 할 때입니다.
우리가 알아야 할 몇 가지 추상화가 있습니다.
- 반복.
- 동기 / 성능 작업 성능.
- 우선 순위.
- 일반적인 문제.
대기열 .
직렬 또는 동시 여야 합니다 . 동시에 글로벌 또는 비공개 .
하나의 완료되고 사용하면 작업이 하나씩 완료되고 동시 대기열로 작업이 완료됩니다. 더 많은 시간이 소요됩니다.
한 고유 개인 대기열 ( 직렬 또는 동시 ) 만들거나 이미을 사용 가능한 전역 (시스템)을 대기열 사용할 수 있습니다 . 주요 큐 가 유일하다 시리얼 큐 의 모든 중 글로벌 큐 .
기본 반복 (네트워크에서 데이터를로드하는 경우)에서 UI 작업을 참조하지 않는 무거운 작업을 수행 하지 말고 다른 쪽에서 수행하여 UI가 고정되지 않고 사용자 작업에 응답하는 것이 좋습니다. 다른 대기열에서 UI를 변경하면 예상치 못한 다른 일정과 속도로 변경 될 수 있습니다. 일부 UI 요소는 필요하기 전이나 나중에 그릴 수 있습니다. UI가 충돌 할 수 있습니다. 또한 전역 대기열 은 시스템 대기열 이므로 시스템에서 실행할 수있는 다른 작업이 있음을 명심해야 우리 합니다.
서비스 품질 / 우선 순위 .
대기열은 또한 작업 수행 우선 순위 를 설정하는 다른 qos (서비스 품질) 를 갖습니다 ( 여기서는 가장 높은 것부터 가장 낮은 것까지) : .userInteractive - main queue .userInitiated- 사용자가 일부 응답을 사용자 시작 작업 .utility- 작업을 위해 시간이 걸리고 빠른 응답이 필요하지 않습니다 (예 : 데이터 .background 작업-시각적 부분과 관련이없고 완료 시간에 엄격하지 않은 작업). 의 QoS 정보를 전송하지 않는 .DEFAULT 큐 도 계명 있습니다 . 검출 할 수 없었다 경우 QoS를
qos 는 .userInitiated 와 .utility 사이 에 사용 됩니다.
작업은 동기식 또는 언어 식으로 수행 할 수 있습니다 .
동기 함수는 작업이 나중에 만 현재 대기열로 제어를 반환합니다. 큐를 차단하고 작업이 완료 될 때까지 기다립니다.
수행 한 함수는 다른 함수에서 수행 작업이 전송 된 잔여 작업을 반환합니다. 작업이 완료 될 때까지 기다리지 않습니다. 규정을 차단하지 않습니다.
일반적인 문제.
프로그래머가 동시 앱을 프로젝션하는 동안 범하는 가장 일반적인 실수는 다음과 가변적입니다.
- 경쟁 조건 -앱이 작동 할 때 발생하는 코드 부분 실행 순서에 따라 실행됩니다.
- 우선 순위 반전 -일부 리소스가 차단되어 우선 순위가 높은 작업이 더 작은 우선 순위 작업이 완료되기를 기다리는 경우
- 교착 상태 -일부 대기열이 이러한 대기열 중 일부에 의해 이미 차단 된 소스 (변수, 데이터 등)를 무한히 기다릴 때.
메인 대기열에서 동기화 기능을 호출하지 마십시오 .
메인 대기열에서 동기화 기능을 호출하면 대기열이 차단되고 대기열이 작업이 완료 될 때까지 대기하지만 대기열이 시작되지 않아 작업을 완료 할 수 없습니다. 이미 차단되었습니다. 교착 상태 라고 합니다.
동기화는 언제 사용합니까? 작업이 끝날 때까지 기다려야 할 때. 일부 함수 / 메서드가 이중 호출되지 않았는지 확인할 때 Fe. Fe 우리는 동기화가 있고 완전히 완료 될 때까지 이중 호출을 방지하려고합니다. 이 문제에 대한 몇 가지 코드는 다음과 같습니다
. IOS 장치에서 오류 충돌 보고서의 원인을 찾는 방법은 무엇입니까?
당신이 사용하는 경우 async
가 파견 블록이 실행될 때까지 기다리지 않고에서 호출 큐 이동을 할 수 있습니다. 반대로 sync
호출 큐를 중지하고 블록에서 디스패치 한 작업이 완료 될 때까지 기다립니다. 따라서 sync
교착 상태가 발생할 수 있습니다. DispatchQueue.main.sync
메인 큐에서 실행 을 시도 하면 호출 큐가 디스패치 된 블록이 끝날 때까지 대기하지만 시작할 수도 없기 때문에 앱이 멈 춥니 다 (큐가 중지되고 대기 중이므로)
언제 사용 sync
합니까? 다른 대기열에서 수행 된 작업을 기다린 다음 현재 대기열에서 계속 작업해야하는 경우
동기화 사용 예 :
직렬 대기열 sync
에서는 하나의 스레드 만 보호 된 코드를 동시에 수행 할 수 있도록 뮤텍스로 사용할 수 있습니다 .
'ProgramingTip' 카테고리의 다른 글
Docker 컨테이너의 실행 명령을 표시하는 방법 (0) | 2020.10.26 |
---|---|
AWS CLI에서 와일드 카드를 사용하여 파일 그룹을`cp` 지불해야 할 일이 있습니까? (0) | 2020.10.26 |
Vim- 검색 적으로 끌어 당김 (0) | 2020.10.26 |
for가없는 SimpleForm (비 모델 양식) (0) | 2020.10.26 |
jQuery .each ()의 각 반복 사이에 일시 중지를 추가하는 방법은 무엇입니까? (0) | 2020.10.26 |