2015-01-03 2 views
2

은 그냥 Apple docs:performSelector : onThread : 왜 좋지 않습니까?

주에서 발견 : 좋은 있지만 스레드 간의 가끔 통신을 위해, 당신은 스레드 사이의 시간 중요하거나 자주 통신을 위해 performSelector:onThread:withObject:waitUntilDone: 방법을 사용해서는 안됩니다.

왜 그렇습니까? "자주"는 얼마입니까?

나는 스레드가 많고 메인 스레드에서 많은 일들이 일어나고있다. (무거운 자바 스크립트, WebKit에서 빈번한 Ajax 쿼리). 요세미티에서 필자는 몇 가지 (예 : 10) 파일 다운로드 (NSURLDownload)와 WebKit GUI (주 스레드에서 실행해야 함)를 조합하여 큰 문제를 경험하기 시작했습니다.

자바 스크립트로 많이로드되는 웹킷을 사용하면 파일 다운로드가 길게 "라이브"할 수 없습니다. 어떤 시점에서 앱이 종료 될 때까지 모든 네트워크 요청이 타임 아웃 (오류 -1001)을 반환하기 시작합니다.

그리고 널리는 performSelector:onThread:withObject:waitUntilDone:을 사용합니다. UI에 다운로드 진행 상황을 알립니다. 이것은 초당 여러 번 발생할 수 있습니다. 문제가 될 수 있습니까?

P. 불행히도, 난 요세미티 문서에 NSObject의 설명서에 이러한 경고 ...

비록 아마도 애플 만이 줄 수는 없다, 이상하게도 ... 전체 소스 코드를 보여

답변

0

을 허용하고 있지 않다 진짜 이유는 성능과 관련이 있다고 생각합니다. NSObject에서 그 호출에 대한 문서에서이 단락을 참고 :

이 방법은 기본 실행 루프 모드 - 즉, NSRunLoopCommonModes 일정과 관련된 모드를 사용하여 대상 스레드의 실행 루프에 메시지를 대기시킵니다. 정상적인 실행 루프 처리의 일부로 대상 스레드는 메시지를 대기열에서 제외하고 (기본 실행 루프 모드 중 하나에서 실행 중이라고 가정) 원하는 메소드를 호출합니다.

즉,이 방법을 사용하면 시스템의 다른 스레드에서 객체를 전달할 수 있으며이 프로세스에는 약간의 오버 헤드가있을 수 있습니다. 시스템은 대상 스레드에 의해 직접 실행된다는 것을 보장합니다.이 실행될 때 을 말하지 않습니다. 타겟 thread가 벌써 무언가를하고있는 경우는, 당신의 메소드가 얼마 동안 불려 가지 않을 가능성이 있습니다. 따라서, 스레드를 가진 모든 것들처럼, 즉각적인 실행을 보장 할 수 없기 때문에, 즉각적으로 실행되는 것보다는 스레드에게 메시지를 보내는 것이 좋습니다 (즉, 플래그 또는 무언가를 업데이트하는 것). 요약하면

는 경고 두 가지 이유가 가능성 :이 일에 약간의 오버 헤드가있다

  • , 그리고 그것은 보장은 없습니다 빠른 메시지
  • 을 보내기위한 좋은하지 않을 때 메소드가 실행됩니다. 그것은 모두 CPU 스케줄러가 스레드 실행 시간을 알려주는 시점과 그 일이 발생했을 때 스레드가 수행하는 작업에 달려 있습니다.
+0

몇 가지 지연을 이해할 수 있습니다. 하지만 내가 말했듯이 네트워크는 완전히 반응이 없습니다. 그래서 나는 또 다른 이유가있을 것이라고 생각했다. 어쩌면 요세미티 특유의 ... –

관련 문제