Nice programing

메인 스레드에서 메서드를 호출합니까?

nicepro 2020. 10. 22. 22:47
반응형

메인 스레드에서 메서드를 호출합니까?


우선 아이폰 용 코드를 작성하고 있습니다. 사용하지 않고 주 스레드에서 메서드를 호출 할 수 있어야합니다 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

반응형