2012-06-18 2 views
1

나는있는 "것으로 someMethod는"다른 클래스에서 인이을 사용하면 클래스 외부의 선택기를 사용할 수 있습니까? 예를 들어

[self performSelectorOnMainThread:@selector(someMethod) 
         withObject:data 
        waitUntilDone:YES]; 

과 같은 방법이있다. 가능하다면 어떻게 할 수 있습니까? 또한 매개 변수를 전달하는 방법을 알고 싶습니다. 당신은 방법을 정의하는 클래스의 인스턴스와 self를 교체해야

- (void)someMethod:(NSData *)data otherArg:(NSString *)arg; 

답변

3

예, 다른 클래스의 선택기를 호출 할 수도 있습니다.

[classInstance performSelectorOnMainThread:@selector(someMethod:) 
        withObject:data 
       waitUntilDone:YES]; 

및 방법 서명이 같은 것입니다 - 선택은 인스턴스 메소드의 경우

+ (void)someMethod:(returntype)somearg 

-

[ClassName performSelectorOnMainThread:@selector(someMethod:) 
        withObject:data 
       waitUntilDone:YES]; 

및 방법 서명 같은 것이있다 - 선택은 클래스 메소드

경우 -

- (void)someMethod:(returntype)somearg 
+0

그럼, [ClassName someMethod : data] 또는 [classInstance someMethod : data]를 직접 호출하지 않는 이유는 무엇입니까? 차이가 있습니까? – Itachi

3

:

는 같은 것으로 someMethod가 정의되어 있다고 가정합니다. 그렇지 않으면 인식 할 수없는 선택자 오류가 발생합니다. 또한 인수를 보내려는 경우 someMethod 뒤에 콜론 ( :)을 삽입하는 것을 잊지 마십시오.

0

셀프 대신 셀렉터를 수행 할 클래스의 인스턴스로 바꾸십시오.

+0

클래스가 아닙니다. 당신은 클래스의 인스턴스를 의미합니다. – aroth

+0

선택기를 수행하려는 클래스의 ** 인스턴스 **. '[self]는 클래스 메소드가 아니라 인스턴스 메소드를 호출하려고한다는 것을 의미합니다. (편집 : @aroth 내 앞에있어 :) –

+0

그래, 내가 그걸 놓친 – TheAmateurProgrammer

1

다릅니다. '자체'가 someMethod을 구현하는 클래스에서 상속받은 경우 물론 그렇게 할 수 있습니다. 그러나 클래스 (또는 상위 클래스)가 해당 메소드를 구현하지 않는 객체에 메시지를 보낼 수는 없습니다. 그 someMethod: 제외

[self someMethod:data]; 

오히려 현재 실행 어떤 스레드가 아닌 주 스레드에서 실행됩니다 :에 (. 음, 당신이 할 수있는,하지만 오류가 기대)

코드를 당신이 보여 조각은 유사하다. 그런 식으로 보면 수신기 (이 경우 self이지만 어떤 객체에 대한 포인터 일 수도 있음)가 보내는 메시지를 구현해야한다는 것을 기억하는 데 도움이 될 수 있습니다.

0

보내려는 메시지에는 두 개의 매개 변수가 필요하며 메시지와 함께 두 개의 매개 변수를 전달하는 변형 performSelectorOnMainThread:...이 없습니다.

가장 쉬운 방법은 Grand Central Dispatch와 블록을 사용하는 것입니다.

dispatch_sync(dispatch_get_main_queue(), ^{ 
    [otherObject someMethod:myData otherArg:@"my argument"]; 
}); 

을하지만 당신은 주 스레드에서 이미있을 때 당신이 그 코드를 실행하면, 그 코드는 : 당신이 경우에 메인 스레드를이 하지 않을 것이다 확실히, 당신은이 작업을 수행 할 수 있습니다 교착 상태 - 앱이 중단됩니다.

주 스레드에서 이 이미 일 때 수행하려는 경우 교착 상태가 발생하지 않도록주의해야합니다. 나는 이렇게 할 것입니다 :

dispatch_block_t block = ^{ 
    [otherObject someMethod:myData otherArg:@"my argument"]; 
}; 

if (dispatch_get_current_queue() == dispatch_get_main_queue()) { 
    block(); 
} else { 
    dispatch_sync(dispatch_get_main_queue(), block); 
}