2011-08-17 4 views
16

"iOS,이 메서드를 a.s.a.p.를 실행하고 싶지만이 실행 루프 반복에 넣지 말고 다음 단계로 넘어가십시오.하지만이 중 하나를 실행하지 마십시오. 감사합니다."메서드 호출 방법 a.s.a.p. 하지만 다음 실행 루프 반복에서 가장 초기에?

는 지금은 항상 이런 식으로 일을하고있다 :

[self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0]; 
[self doSomeOtherThings]; 

-doSomeOtherThings 항상 -doSomethingInNextRunLoop하기 전에 수행 할 것이라는 가정으로.

문서는 말한다 :

0의 지연이 반드시 선택이 즉시 수행 할 수 발생하지 않습니다 지정. 선택기는 여전히 스레드의 실행 루프에 대기하고 가능한 한 빨리 수행됩니다.

그래서 기본적으로는 -doSomeOtherThings 전에 실행할 -doSomethingInNextRunLoop의 원인, 난 그냥 직접 메시지를 보낸 것처럼 메소드가 즉시 호출되는 일이 발생할 수 있습니까?

어떻게하면 a.s.a.p.라는 이름을 붙일 수 있습니까? 그러나 결코 같은 실행 루프 반복에서 절대?

문구를 명확하게하기 : 실행 루프에서는 주 스레드와 스레드가 새로운 이벤트를 위해 다시 준비 될 때까지 모든 메서드를 반환해야하는 반복을 의미합니다.

답변

9

애플이 언젠가 특수한 경우에 지연이 0이 될지 모른다면 항상 1e-37 정도의 지연을 지정할 수 있습니다. performSelector:withObject:afterDelay:에 대한 설명서는 선택기가 다음 실행 루프 반복에 대해 항상 예약되도록 보장하기 위해 쉽게 읽을 수 있습니다.

언젠가 애플이 언젠가 임의의 하한보다 적은 특수한 경우가 있을지도 모른다는 걱정이 든다면 NSRunLoop의 performSelector:target:argument:order:modes:을 항상 사용해 볼 수 있습니다. 문서에서는 특별히 다음과 같이 실행 루프의 반복 실행을 예약합니다.

+0

최고! 이것을 용이하게하는 범주는 의미가 있습니다. – openfrog

0

확실히이 작업을 수행하십시오.

[self doSomeOtherThings]; 
[self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0]; 

원하는 실행 순서가 보장됩니다.

+1

항상 그림에 사용이 간단한 예제보다 더 복잡한 경우에 그 방법으로 코드를 재 배열 편리 (또는 수) 없습니다. – Anomie

+0

아닙니다. NEXT 실행 루프 반복에서 일을 수행하는 데는 좋은 이유가 있습니다. 그 중 하나 : UI를 새로 고침시키기. 인식 된 성능 향상. 많은 사람들 중에. 게다가, 아노미 말이 맞아. – openfrog

+0

확실히, Anomie의 응답이 머리의 못을 쳤습니다. 일부 사례에서는 코드 재배치가 문제를 해결할 수 있다고 지적하고 있습니다. 약간의 작가 블록, 때로는 devs 때로는 측면 계획이있을 때 특정 방법으로 문제를 해결에 매달려. FWIW 나는 어디에서 표준 performSelector : withObject : afterDelay : 0 결과를 인식하지 못한다. 이 기술을 자주 차단하고 다른 사용자가 작성한 UI 코드를 최적화하는 데 자주 사용합니다. – Roger

1

설명서를 읽지 못해 결론을 잘못했다고 생각합니다.

그래서 기본적으로 난 그냥 당신이 인용 문서의 부분은 선택이 항상에 대기 있다고

번호를 직접 메시지를 보낸 것처럼 메소드가 즉시 호출되는 일이 발생할 수 있습니다 루프를 실행하십시오. 따라서 직접 메시지처럼 실행되지 않습니다.

"반드시 필요하지 않은"첫 번째 문장은 조금 오도 될 수도 있지만 두 번째 문장은 두려움이 실제로 일어나지 않아야한다는 것을 분명히해야한다고 생각합니다.GCD (그랜드 센트럴 파견)를 사용하여

+0

많은 사람들이 다음 반복을 위해 대기중인 beeing에 의존 할 것이기 때문에 당신이 맞기를 바랍니다. 아직도 불확실성이 있습니다. – openfrog

6

아주 사소한 :

dispatch_async (dispatch_get_main_queue(), ^{ 
    NSLog (@"This stuff runs in the next iteration of the main run loop"); 
});