2013-12-21 2 views
0

에서 메인 스레드로 다시 받고 내가 NSTimer는 다음과 같이 정의 있습니다NSTimer

[NSTimer scheduledTimerWithTimeInterval:self.speed target:self selector:@selector(displayTextOverTime:) userInfo:nil repeats:YES]; 

텍스트를 표시 displayTextOverTime에있어서, 다음 텍스트의 마지막 조각이 표시되면 그것은 타이머의 무효화 및 처리를위한 다른 방법을 호출 (자체적으로 텍스트를 표시하려면 NSTimer을 시작해야 할 수도 있음).

이런 종류의 작업을 수행하는 표준 방법이 있습니까?

내 원래의 접근 방식은 단순히 displayTextOverTime을 다른 방법으로 호출하는 것이 었습니다. 그러나 이것은 내게 NSTimer을 중첩시켜 놓은 이상한 행동을 일으키고 있습니다. 결코 무효화되고 다시 반복되지 않기 때문에 죽지 않습니다. 그들 내부의 타이머가 여전히 실행 중이기 때문에 '완료'되지 않았는가 ... 또는 ... 무언가?), 이것은 내가 원하는 것이 아니다. "이 메서드를 호출하지만이 NSTimer 외부에서 수행하십시오"라고 말할 수있는 방법이 있습니까, 다시 예를 들어 주 스레드 에서처럼?

특히, 시작한 것보다 더 많은 타이머가 죽는 것을보고 있습니다. (나는 죽을 때 기록 할 수 있도록 타이머를 죽이는 방법이 있습니다.)

+0

[NSObject] 메소드 ['performObjectOnMainThread : withObject : waitUntilDone :'] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference)가 있습니다. .html # // apple_ref/doc/uid/20000050-CJBEHAEF). – user1118321

+0

1. 반복 가능한 타이머를 만든 다음 모든 호출에서이를 무효화 할 필요가 없습니다. 2. performSelector : afterDelay를 지연 0으로 호출 할 수 있습니다.이 메서드는 기본 runloop의 다음 루프에서 실행됩니다. – EricS

+0

에릭에게, 나는 모든 호출에서 그것을 무효화하지는 않을 것이다. 오히려, 나는 다음과 같이 말하고 있습니다. "완료 될 때까지이 메서드를 X ms마다 호출하고, 완료 될 때까지이 메서드를 X ms마다 호출하십시오. 이것은 읽기 쉬운 속도로 매번 텍스트를 한 단어 씩 표시 한 다음 더 많은 텍스트를 가져와 (있는 경우) 한 번에 한 단어 씩 다시 표시합니다. – Jenny

답변

3

질문에 대한 정확한 답변을 보려면 Grand Central Dispatch를 사용하여 타이머 외부에서 기능을 실행할 수 있습니다. 함수를 실행하려면 다음을 입력하십시오.

dispatch_async(dispatch_get_main_queue(), ^{ 
     (your function or block of code goes here) 
    }); 

그러면 타이머 밖에서 블록이 실행됩니다. 작성한 대기열이있는 주 스레드, 전역 스레드 또는 사용자 정의 스레드에서이 작업을 수행하도록 선택할 수 있습니다.