메인 스레드에서 메서드를 호출합니까?
우선 아이폰 용 코드를 작성하고 있습니다. 사용하지 않고 주 스레드에서 메서드를 호출 할 수 있어야합니다 performSelectorOnMainThread
. 사용하고 싶지 않은 이유는 performSelectorOnMainThread
단위 테스트를 위해 모의를 만들려고 할 때 문제가 발생하기 때문입니다.
[self performSelectorOnMainThread:@Selector(doSomething) withObject:nil];
문제는 내 모의가 호출하는 방법을 알고 doSomething
있지만 호출하는 방법을 모른다는 것입니다 performSelectorOnMainThread
.
그래서 어떤 해결책?
목표 -C
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething];
});
빠른
dispatch_async(dispatch_get_main_queue()) {
self.doSomething()
}
Swift 3 및 4
DispatchQueue.main.async {
self.doSomething()
}
소프트웨어에는 간접적 계층을 추가하면 거의 모든 것이 해결된다는 말이 있습니다.
doSomething 메소드가 실제 Something 작업을 수행하기 위해 really_doSomething 메소드를 호출하기 위해 performSelectorOnMainThread 만 수행하는 간접 쉘이되도록하십시오. 또는 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()
}
참고 URL : https://stackoverflow.com/questions/5606145/calling-a-method-on-the-main-thread
'Nice programing' 카테고리의 다른 글
intl 확장 : php_intl.dll 설치 (0) | 2020.10.22 |
---|---|
UnicodeEncodeError : 'ascii'코덱은 위치 0의 문자 u '\ xef'를 인코딩 할 수 없습니다 : 서 수가 범위에 없습니다 (128). (0) | 2020.10.22 |
데이터 테이블에서 페이지 매김을 제거하는 방법 (0) | 2020.10.22 |
NSDictionary에 확인 키가 있습니다. (0) | 2020.10.22 |
Android Textview 개요 텍스트 (0) | 2020.10.22 |