메인 스레드에서 메서드를 호출하시겠습니까?
우선 저는 아이폰 코드를 작성하고 있습니다.사용하지 않고 메인 스레드에서 메서드를 호출할 수 있어야 합니다.performSelectorOnMainThread
사용하고 싶지 않은 이유performSelectorOnMainThread
유닛 테스트를 위한 모의실험을 만들 때 문제가 발생한다는 것입니다.
[self performSelectorOnMainThread:@Selector(doSomething) withObject:nil];
문제는 내 모의고사가 어떻게 전화를 하는지 알고 있다는 것입니다.doSomething
하지만 어떻게 전화해야 할지 모릅니다.performSelectorOnMainThread
.
그래서 어떤 해결책이라도?
목표-C
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething];
});
스위프트
DispatchQueue.main.async {
self.doSomething()
}
레거시 스위프트
dispatch_async(dispatch_get_main_queue()) {
self.doSomething()
}
소프트웨어에는 간접적인 레이어를 추가하면 거의 모든 것이 해결된다는 말이 있습니다.
doSomething 메서드가 SelectorOnMainThread만 수행하는 간접 셸이 되도록 하여 실제 Something 메서드를 really_doSomething 메서드를 호출합니다.또는 doSomething 메서드를 변경하지 않으려면 모의 테스트 유닛에서 doSomething_redirect_shell 메서드를 호출하여 유사한 작업을 수행하도록 합니다.
Swift에서 이를 수행하는 더 나은 방법은 다음과 같습니다.
runThisInMainThread { () -> Void in
// Run your code
self.doSomething()
}
func runThisInMainThread(block: dispatch_block_t) {
dispatch_async(dispatch_get_main_queue(), block)
}
내 레포에 표준 기능으로 포함되어 있으니 확인해 보세요. https://github.com/goktugyil/EZSwiftExtensions
이제 Swift 3에서:
DispatchQueue.main.async{
self.doSomething()
}
현대의 Swift 솔루션은 안전한 멀티스레딩을 위해 행위자를 사용하는 것입니다. 즉,MainActor
.
@MainActor func setImage(thumbnailName: String) {
myImageView.image = UIImage(image: thumbnailName)
}
여기서는 배우 기반의 메인 스레드 솔루션에 대해 설명했습니다.
// Draw Line
func drawPath(from polyStr: String){
DispatchQueue.main.async {
let path = GMSPath(fromEncodedPath: polyStr)
let polyline = GMSPolyline(path: path)
polyline.strokeWidth = 3.0
polyline.strokeColor = #colorLiteral(red: 0.05098039216, green: 0.5764705882, blue: 0.2784313725, alpha: 1)
polyline.map = self.mapVu // Google MapView
}
}
언급URL : https://stackoverflow.com/questions/5606145/calling-a-method-on-the-main-thread
'programing' 카테고리의 다른 글
더 작은 크기로 재할당을 호출하면 나머지가 해방된다고 가정할 수 있습니까? (0) | 2023.08.05 |
---|---|
도커: 상위 디렉토리에서 파일 추가 (0) | 2023.08.05 |
Swift UI 해제 모달 (0) | 2023.08.05 |
전자 메일을 보내기 위해 Send-MailMessage 명령에 자격 증명을 전달하는 방법 (0) | 2023.08.05 |
Oracle Insert via 한 테이블에 행이 없을 수 있는 여러 테이블 중에서 선택 (0) | 2023.08.05 |