2009-05-16 2 views

답변

0

직접적으로. performSelector:withObject:afterDelay:을 사용하는 경우 선택자는 메인 스레드에서 수행되므로 정의에 따라 현재의 모든 "대기중인"UI 이벤트가 수행 된 후에 발생합니다.하지만 스크롤 또는 애니메이션의 중간에있을 수 있습니다. 하나의 연속 이벤트로 간주되지만 실제로는 수백 개의 개별 이벤트입니다.

그러나 비슷한 방법으로 performSelectorInBackground:withObject:을 사용하고 호출중인 메서드에서 [NSThread setThreadPriority:0.01]을 호출 할 수 있습니다. UI 호출을 할 수 없도록 배경 스레드를 열고 있습니다. 그러나 이렇게하면 기본 UI 스레드보다 우선 순위가 낮은 백그라운드 스레드에서 작업을 수행 할 수 있습니다. (그것의 자신의 스레드에서 이후 오토 릴리즈 풀을 설정하는 것을 잊지 마십시오!)

+0

감사합니다. 적어도 나는 지금 청어를 쫓지 말라고 알고있다. 가끔은 UI가 반응하지 않는 것에 의문을 가지고 애니메이션을 보겠습니다. –

5

사실, performSelector:withObject:afterDelay: 반드시 주 스레드에서 발생하지 않는다; 그런 이유로 별도의 방법 performSelectorOnMainThread:withObject:waitUntilDone:이 있습니다. performSelector:withObject:afterDelay:에 대한 문서는

이 지연 후에 기본 모드를 사용하여 현재 스레드에서 수신기의 메소드를 호출했다. 당신이 백그라운드에서 작업을 수행하려면

, 당신은 당신의 작업을 수행 할 새 스레드를 시작할 것이다, +[NSThread detachNewThreadSelector:toTarget:withObject:]로보고, 응답하는 UI를두고 있습니다. 별도의 스레드를 사용하여 달리 UI를 잠글 수있는 장기 실행 작업을 수행하는 것이 일반적으로 좋은 생각이지만 복잡성이 추가됩니다. 스레딩에 익숙하지 않은 경우 버그가 생겨 결국에는 이해가되지 않을 수 있습니다.

위의 설명에서 UI가 응답하지 않는 경우 애니메이션이 잘못되었을 수 있다고 생각한다고 언급했습니다. 애니메이션 (Core Animation 또는 Cocoa 래퍼 중 하나)에 기본 제공 지원을 사용하는 경우 애니메이션으로 인해 UI가 응답하지 않아야합니다. 응답이없는 UI는 일반적으로 실행 루프가 서비스 UI 이벤트로 돌아 가기 전에 프로그램이 주 스레드에서 많은 작업을 수행하고 있음을 의미합니다.