UIKit, AppKit의뿐만 아니라 여러 스레드 사이의 API를 사용하여 다른주의 사항

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()

추천

출처www.cnblogs.com/jeffersonqin/p/11258834.html