2010-06-28 3 views
0

나는이 같은 프로토콜을 정의했습니다 :비동기 대리자 메서드를 전송 - 아이폰

@protocol RSSItemParserDelegate <NSObject> 
- (void)RSSItemParser:(RSSItemParser *)parser 
didEndParsingSuccesfully:(BOOL)success; 
@end 

그리고 몇 가지 분석이 완료이 메서드를 호출하고, YES 성공과 실패 NO에, 같은 :

[delegate RSSItemParser:self didEndProcessSuccesfully:NO]; 

하지만 주 스레드에서 비동기 적으로 실행하고 싶습니다. 어떻게해야합니까?

내가 생각하기로는 performSelectorOnMainThread:withObject:waitUntilDone:이 단독 인수 방법으로 작동하지만, 광산과 같은 두 인수가있는 메소드는 어떨까요? 특히 AVFoundation 및 CoreVideo와 함께 작업 할 때 두 개 이상의 인수가있는 대리자 메서드가 많이 있습니다. 어떻게 호출되는지 궁금합니다.

감사

이그나시오

답변

2
SEL action = @selector(actionWithFoo:bar:baz:); 
NSInvocation * i = [NSInvocation invocationWithMethodSignature:[target methodSignatureForSelector:action]]; 
[i retainArguments]; 
[i setTarget:target]; 
[i setAction:action]; 
[i setArgument:&foo atIndex:2]; 
[i setArgument:&bar atIndex:3]; 
[i setArgument:&baz atIndex:4]; 
[i performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:NO]; 

사전을 사용하면 훨씬 쉽고 확장 가능합니다.

+0

이것은 NSInvocation을 사용하는 훌륭한 예이며 내 요구 사항에 완벽합니다. 감사;) – nacho4d

1

이 작업을 수행하는 많은 방법이있다. NSInvocation API를 사용하여 performSelector... 메서드 중 하나를 사용하는 호출 객체를 만들 수 있습니다 (invoke 및 그 동어가 0 또는 1 매개 변수를 사용하기 때문에). 또는 대리자에게 전달해야하는 모든 값을 감싸는 단일 "컨텍스트"개체 (구조체 또는 사전)를 사용하는 내부 래퍼 메서드를 만들 수 있습니다. 그런 다음 주 스레드에서 해당 메서드를 수행하고 컨텍스트 값을 압축하여 실제 대리자 메서드에 전달합니다. 또는 컨텍스트 개체를 대리인에게 직접 전달하고 풀기 작업을 수행 할 수 있습니다.

+0

감사합니다. 예를 보여 줄 수 있습니까? 나는 이것을 오해하고 있을지 모르나, 나는 그것이 drawnonward의 대답과 닮았다 고 생각한다. 오직 NSInvocation 만 사용한다. – nacho4d

0

쉬운 방법은 하나의 인수 만 필요한 메서드를 만드는 것입니다.

-(void) invokeDelegateWithDidEndProcessSuccesfully:(NSNumber)success { 
    [delegate RSSItemParser:self didEndProcessSuccesfully:[success boolValue]]; 
} 

이 그 다음을 사용 :

-(void) didEndParsingSuccesfully:(BOOL)success { 
    [self performSelectorOnMainThread:@selector(invokeDelegateWithDidEndProcessSuccesfully) withObject:[NSNumber numberWithBool:success] waitUntilDone:NO]; 
} 

하드 방법은 인수의 임의의 수를 처리 할 수있는 NSInvocation을 사용하는 것입니다 당신이 경우, 대리자 호출 방법을 확인하십시오. 인수는 내재적으로 보유되지 않습니다.

+0

답장을 보내 주셔서 감사합니다. 지금 실제로하고있는 일입니다. 그러나 나는이 일을 더 "우아한"또는 "올바른"방법이 있어야한다고 생각했습니다. – nacho4d

관련 문제