Dispatch Queue.main.async와 Dispatch Queue.main.sync의 차이점
는 요즘 용하 i하고 i i i 。DispatchQueue.main.async
UI를 사용합니다.
는 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 작업이 느려지거나 중지됩니다.동시성을 통해 둘 이상의 태스크를 "동시에" 수행할 수 있습니다.이 접근법의 단점은 나사산의 안전성이 항상 제어하기 쉽지는 않다는 것입니다.예를 들어, 다른 스레드에서 동일한 변수를 변경하려고 시도하거나 다른 스레드에 의해 이미 차단된 리소스에 액세스하는 등 다른 태스크가 동일한 리소스에 액세스하려는 경우.
우리가 알아야 할 몇 가지 추상화들이 있다.
- 큐
- 동기/비동기 작업 성능.
- 우선 순위
- 흔한 문제.
큐
직렬 또는 동시여야 합니다.글로벌 또는 프라이빗과 동시에 이용할 수 있습니다.
시리얼 큐에서는 작업이 하나씩 완료되고 동시 큐에서는 작업이 동시에 수행되며 예기치 않은 일정에 따라 완료됩니다.같은 태스크 그룹은 동시 큐에 비해 시리얼 큐에 걸리는 시간이 길어집니다.
독자적인 프라이빗 큐(시리얼 또는 동시 모두)를 작성하거나 이미 사용 가능한 글로벌(시스템) 큐를 사용할 수 있습니다.메인 큐는 모든 글로벌큐 중 유일한 시리얼큐입니다
메인 큐에서 UI 작업(네트워크에서 데이터를 로드하는 등)이 아닌 다른 큐에서 작업을 수행하여 UI가 동결 해제되고 사용자 작업에 응답할 수 있도록 하는 것이 좋습니다.다른 큐에서 UI를 변경할 경우 예기치 않은 다른 일정과 속도로 변경할 수 있습니다.일부 UI 요소는 필요 전후에 그릴 수 있습니다.UI가 크래시 될 수 있습니다.또한 글로벌 큐는 시스템큐이기 때문에 시스템에서 실행할 수 있는 다른 태스크도 있다는 점에 유의해야 합니다.
서비스 품질/우선순위
큐에는 다른 Quality of Service(QoS; 서비스 품질)도 있습니다.이 QoS는 priority를 실행하는 태스크(여기서는 최고에서 최저로)를 설정합니다.
.userInteractive - 메인큐의 경우
.userInitiated - 사용자가 시작한 태스크에 대해 사용자가 응답을 기다립니다.
.filename - 데이터 작업 등 시간이 걸리고 즉각적인 응답이 필요하지 않은 작업입니다.
.background - 시각적인 부분과 관련이 없고 완료 시간 동안 엄격하지 않은 작업입니다.)
, there있있 there 도 있다.
.default 큐는 QoS 정보를 전송하지 않습니다.qos를 검출할 수 없는 경우 qos는 .userInitiated와 .utility 사이에서 사용됩니다.
작업은 동기 또는 비동기적으로 수행할 수 있습니다.
동기 함수는 작업이 완료된 후에만 현재 큐로 제어를 반환합니다.큐를 차단하고 작업이 완료될 때까지 기다립니다.
비동기 함수는 다른 큐에서 수행하도록 작업이 전송된 직후에 현재 큐로 제어를 반환합니다.작업이 완료될 때까지 기다리지 않습니다.대기열을 막지 않습니다.
일반적인 문제
프로그래머가 동시 앱을 투영할 때 가장 많이 하는 실수는 다음과 같습니다.
- 레이스 조건 - 코드 파트 실행 순서에 따라 앱이 작동할 때 발생합니다.
- 우선순위 반전 - 일부 리소스가 차단되어 우선순위가 높은 태스크가 우선순위가 낮은 태스크가 완료될 때까지 대기하는 경우
- 교착 상태 - 몇 개의 큐가 이러한 큐 중 일부에 의해 이미 차단된 소스(변수, 데이터 등)를 무한 대기하는 경우.
메인 큐의 동기 함수를 호출하지 마십시오.
메인 큐에서 동기 함수를 호출하면 큐는 차단되고 큐는 태스크 완료를 대기하지만 큐는 이미 차단되어 있기 때문에 시작할 수 없기 때문에 태스크는 종료되지 않습니다.그것은 교착상태라고 불린다.
동기화 사용 시기작업이 완료될 때까지 기다려야 할 때.예를 들어, 일부 함수/메서드가 이중 호출되지 않았는지 확인하는 경우.F.e. 동기화가 완료되고 완전히 완료될 때까지 이중 호출을 방지하려고 합니다.이 문제에 대한 몇 가지 코드는 다음과 같습니다.
IOS 디바이스에서 에러 크래시 리포트의 원인을 특정하려면 어떻게 해야 합니까?
사용할 때async
그러면 디스패치된 블록이 실행될 때까지 기다리지 않고 발신 큐가 이동할 수 있습니다.반대로sync
는 발신 큐를 정지하고 블록에서 디스패치한 작업이 완료될 때까지 기다립니다.그러므로sync
교착 상태가 될 수 있습니다.실행해 보다DispatchQueue.main.sync
메인 큐에서 어플리케이션이 프리즈 되는 이유는 콜 큐가 디스패치된 블록이 끝날 때까지 대기하지만 시작조차 할 수 없기 때문입니다(큐가 정지되어 대기하고 있기 때문입니다).
「 」를 sync
후 해야 할
동기화 사용 예:
에서는, 「일련의 큐」를 사용할 수 .sync
하나의 스레드만 보호된 코드를 동시에 실행할 수 있도록 하기 위해 mutex로 지정합니다.
디스패치 큐<< sync > vs Dispatch Queue > 。<<고객명>>님
GCD
할 수 .synchronously
★★★★★★★★★★★★★★★★★」asynchronously
synchronous
wait)될 때 합니다(예: 작업이 완료될 때).
asynchronous
는 즉시 큐에 될 때까지 않습니다
sync
★★★★★★★★★★★★★★★★★」async
메서드는 호출된 큐에 영향을 주지 않습니다.
sync
는 호출된 스레드를 차단하고 호출된 큐는 차단하지 않습니다.그것은 의 재산이다.DispatchQueue
를 사용하여 " ", ", ", ", "가 결정됩니다.DispatchQueue
는 태스크 실행을 기다리거나(큐잉) 현재 태스크가 완료되기 전에 다음 태스크를 실행할 수 있습니다(동시 큐).
★★★★★★★★★★★★★★★★★★★★★★★DispatchQueue.main.async
는 비동기 콜입니다.이 콜에 추가된 헤비듀티 동작은 메인스레드에서 시리얼로 실행되기 때문에 UI를 정지시킬 수 있습니다.백그라운드 스레드에서 이 메서드를 호출하면 UI가 정지된 것처럼 보여도 즉시 해당 스레드로 제어가 돌아갑니다.그 이유는async
가 DispatchQueue.main
언급URL : https://stackoverflow.com/questions/44324595/difference-between-dispatchqueue-main-async-and-dispatchqueue-main-sync
'programing' 카테고리의 다른 글
iOS Simulator에서 콘솔 로그를 가져오려면 어떻게 해야 합니까? (0) | 2023.04.16 |
---|---|
SQL에서 VARCHAR이 아닌 CHAR을 선택하는 사용 사례는 무엇입니까? (0) | 2023.04.16 |
저장 프로시저란 무엇입니까? (0) | 2023.04.16 |
"Write-Host", "Write-Output" 또는 "[console]"의 차이점은 무엇입니까?: WriteLine? (0) | 2023.04.16 |
워크북의 끝에 VBA 복사 시트(숨긴 워크시트 포함) (0) | 2023.04.16 |