UIKit, AppKit의뿐만 아니라 여러 스레드 사이의 API를 사용하여 다른주의 사항
개요
메인 스레드 검사기는 백그라운드 스레드에서 AppKit의, UIKit과 다른 API의 잘못된 사용을 감지 스위프트와 C 언어 독립 실행 형 도구입니다. 메인 스레드가 아닌 다른 스레드에서 UI를 업데이트 놓친 UI 업데이트, 시각적 결함, 데이터 손상 및 충돌을 초래할 수있는 일반적인 실수이다.
어떻게 메인 스레드 검사기 작품
앱 시작시, 메인 스레드 검사기는 동적으로 만 검사를 앞에 추가 버전과 주 스레드에서 호출 할 필요가 방법의 구현을 대체합니다. 백그라운드 스레드에서 사용이 체크에서 제외됩니다 알려진 방법은 안전합니다.
노트
다른 코드 진단 도구와는 달리, 메인 스레드 검사기 재 컴파일을 필요로하지 않으며, 기존의 바이너리와 함께 사용할 수 있습니다. 당신은에있는 동적 라이브러리 파일을 주입하여, 이러한 지속적인 통합 시스템으로, Xcode의 디버거없이 맥 OS 응용 프로그램에서 실행할 수 있습니다 /Applications/Xcode.app/Contents/Developer/usr/lib/libMainThreadChecker.dylib
.
성능에 미치는 영향
메인 스레드 검사기의 성능에 미치는 영향은 1 ~ 2 %의 CPU 오버 헤드 <0.1 초 추가 공정 실행 시간이 최소화된다.
당신은 엑스 코드 디버거를 사용하여 응용 프로그램을 실행할 때 때문에 최소한의 성능 오버 헤드의 메인 스레드 검사기는 자동으로 활성화됩니다.
완료 핸들러로부터 UI 업데이트
네트워킹과 같은 장기 실행 작업은 종종 백그라운드에서 실행 및 완료를 알리기 위해 완료 핸들러를 제공한다. 읽거나 문제가 발생할 수 있습니다 완료 핸들러에서 UI를 업데이트하려고.
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data {
self.label.text = "\(data.count) bytes downloaded"
// Error: label updated on background thread
}
}
task.resume()
해결책
메인 스레드에 레이블 텍스트를 업데이트하기 위해 호출을 전달합니다.
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data {
DispatchQueue.main.async { // Correct
self.label.text = "\(data.count) bytes downloaded"
}
}
}
task.resume()