我已经定义了这样的协议:
@protocol RSSItemParserDelegate <NSObject>
- (void)RSSItemParser:(RSSItemParser *)parser
didEndParsingSuccesfully:(BOOL)success;
@end
我在一些解析完成后调用此方法,成功时是YES,失败时是NO,如下所示:
[delegate RSSItemParser:self didEndProcessSuccesfully:NO];
但我希望它能异步运行在主线程中。我怎么能这样做?
我认为performSelectorOnMainThread:withObject:waitUntilDone:
可以使用单独的参数方法,但是如何使用两个参数(如地雷)?
特别是在使用AVFoundation和CoreVideo时,有很多委托方法有超过2个参数,我想知道它们是如何调用的。
由于
伊格纳西奥
答案 0 :(得分: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];
使用字典会更容易,更易于扩展。
答案 1 :(得分:1)
有很多方法可以做到这一点。您可以使用NSInvocation
API创建一个调用对象,然后使用其中一个performSelector...
方法(因为invoke
并且其亲属取0或1个参数)。或者,您可以创建一个内部包装器方法,该方法接受一个“上下文”对象(结构或字典),该对象包含您需要传递给代理的所有值。然后,在主线程上执行该方法并解压缩上下文值以将它们传递给您的实际委托方法。或者,您可以直接将上下文对象传递给您的委托,然后让它进行解压缩。
答案 2 :(得分: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来处理任意数量的参数。没有隐含地保留任何参数。