通过Objective-C中的NSInvocation将参数传递给NSInvocationOperation

通过Objective-C中的NSInvocation将参数传递给NSInvocationOperation,objective-c,Objective C,我正在进一步熟悉NSOperation并发性,遇到了一个有关NSInvocationOperation的问题 下面是我想要运行的方法: - (void) myTaskMethod:(NSString *)stringArg { NSLog(@"StringArg: %@", stringArg); } 下面是我如何调用它**工作** 问题: 我正试图用一种不同的方式来做这件事,准备一个NSInvocation并以这种方式传递它。这是我的密码: NSMethodSignature *si

我正在进一步熟悉NSOperation并发性,遇到了一个有关
NSInvocationOperation
的问题

下面是我想要运行的方法:

- (void) myTaskMethod:(NSString *)stringArg {
    NSLog(@"StringArg: %@", stringArg);
}
下面是我如何调用它**工作**

问题: 我正试图用一种不同的方式来做这件事,准备一个NSInvocation并以这种方式传递它。这是我的密码:

NSMethodSignature *sig = [self methodSignatureForSelector:@selector(myTaskMethod:)];
NSInvocation * myTaskMethodInvocation = [NSInvocation invocationWithMethodSignature:sig];
NSString * hello = @"Hello From NSInvocation";
[myTaskMethodInvocation setArgument:&hello atIndex:2];
NSInvocationOperation * invocationOperation1 = [[NSInvocationOperation alloc]initWithInvocation:myTaskMethodInvocation];
invocationOperation1.completionBlock = ^{
    NSLog(@"We finished w/ NSInvocation");
};
[invocationOperation1 start];

它正在记录“我们完成了w/NSInvocation”,但是,
myTaskMethod:
从未运行。我想我错过了一些东西,因此非常感谢您的帮助。

来自
invocationWithMethodSignature
的文档:

新对象的选择器必须设置为
setSelector:
及其 在调用参数之前,使用
setArgument:atIndex:
设置参数

我认为你需要补充:

[myTaskMethodInvocation setTarget:self];
[myTaskMethodInvocation setSelector:@selector(myTaskMethod:)];

成功了。我猜我以为它会从methodSignature中得到这些信息。将在6分钟内接受(当它允许我时),谢谢。你知道为什么它甚至会费心尝试获取methodSignature吗?我不完全确定,但我认为
NSInvocation
需要了解有关方法的一些实现细节才能调用它,这些细节封装在
NSMethodSignature
对象中。如果你看一下文档,它会讨论堆栈帧长度和返回类型等等。。。
[myTaskMethodInvocation setTarget:self];
[myTaskMethodInvocation setSelector:@selector(myTaskMethod:)];