2010-06-20 4 views
2

나는 여전히 Objective C 구문에 익숙하지 않으므로 이것을 복잡하게 만들 수도 있지만 스레드에 NSTimeInterval을 전달하는 방법을 생각할 수 없습니다.object 매개 변수를 사용하여 detachNewThreadSelector에 NSTimeInterval 객체를 전달하는 방법은 무엇입니까?

나는 다음과 같이 메인 스레드에서 보낸 x 초 매개 변수에 잠 스레드 시작하려면 :

[NSThread detachNewThreadSelector:@selector(StartServerSynchThread) toTarget:self withObject:5]; 

- (void) StartServerSynchThread:(NSTimeInterval *)sleepSecondsInterval { 

    [NSThread sleepForTimeInterval:sleepSecondsInterval]; 

} 

을하지만 컴파일러는 나에게 구문 오류를주는 유지합니다. 정확히 어떻게해야하는지 잘 모르겠습니다. 어떤 도움을 주시면 감사하겠습니다. 감사!

답변

2

id 매개 변수는 id 유형이므로 클래스 유형의 객체 만 전달할 수 있습니다. 전달하려는 5과 같은 정수는 NSTimeInterval (double의 경우 실제로는 typedef)이며 클래스 유형이 아닌 기본 유형입니다.

NSNumber을 래퍼로 사용하거나 NSDate을 대신 전달할 수 있습니다.

+0

감사하지만,있는 NSDate 옵션은 해킹처럼 많이 보인다 :) 당신이 NSNumber (NSValue의 서브 클래스)에 NSTimeInterval를 상자 경우

, 당신은 대신에 그것을 전달할 수 있습니다 나에게. NSValue 솔루션을 게시하기에 충분히 친절하십니까? 위의 코드를 실행하려고하면 런타임 오류가 발생합니다. *** 'NSIhvalidArgumentException'이라는 캐치되지 않은 예외로 인해 응용 프로그램을 종료하는 중 '*** - [NSThread initWithTarget : selector : object :] : target은 selector (*** - [MainScreenController StartServerSynchThread])를 구현하지 않습니다. ' – Yousef

+0

@Ya 당신은 메소드 이름의 끝에':'을 잊었습니다. –

11

이것은 거의 정확하게 @ Georg의 대답과 동일하지만 적절한 유형을 사용합니다. 빠른 응답을

[NSThread detachNewThreadSelector:@selector(startServerSynchThread:) 
         toTarget:self 
         withObject:[NSNumber numberWithDouble:myTimeInterval]]; 

- (void) startServerSynchThread:(NSNumber *)interval { 
    [NSThread sleepForTimeInterval:[interval doubleValue]]; 
} 
+0

완벽한! 메서드의 주장이하는 것이 무엇보다 명확하므로이 솔루션을 더 좋아합니다. 또한 런타임 오류가 메서드 이름 "@selector (startServerSynchThread :".Dave! – Yousef

+1

NSNumber)의 콜론 (:)으로 고정되었지만 물론 커피가 누락되었을 수 있습니다 :) –