NSInvocationOperation和NSBlockOperation有什么区别?

Foundation Framework中有三个操作类( NSOperationNSInvocationOperationNSBlockOperation )。

我已经阅读了并发编程指南,但是我不明白这三个类之间究竟有什么区别。 请帮帮我。

NSBlockOperation执行一个块。 NSInvocationOperation执行NSInvocation (或由target,selector,object定义的方法)。 NSOperation必须分类,它提供了最大的灵活性,但需要最多的代码。

NSBlockOperation和NSInvocationOperation都是NSOperation的子类。 它们由系统提供,因此您不必为简单任务创build新的子类。

使用NSBlockOperation和NSInvocationOperation应该足够用于大多数任务。


下面是使用所有三个完全相同的东西的代码示例:

 // For NSOperation subclass @interface SayHelloOperation : NSOperation @end @implementation SayHelloOperation - (void)main { NSLog(@"Hello World"); } @end // For NSInvocationOperation - (void)sayHello { NSLog(@"Hello World"); } - (void)startBlocks { NSBlockOperation *blockOP = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"Hello World"); }]; NSInvocationOperation *invocationOP = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(sayHello) object:nil]; SayHelloOperation *operation = [[SayHelloOperation alloc] init]; NSOperationQueue *q = [[NSOperationQueue alloc] init]; [q addOperation:blockOP]; [q addOperation:invocationOP]; [q addOperation:operation]; } 

NSOperation是基类。 所有的操作扩展NSOperation。 但它是一个抽象类,意味着您需要对其进行子类化并实现执行实际操作的代码。

对于简单的情况,这(做你自己的子类)是不必要的,但是。

如果你只是想传递一个消息给一个对象,你可以使用NSInvocationOperation。 这是NSOperation的一个实现,可以通过select器和目标对象进行参数化。

如果你只是想再调用一个块,你可以使用NSBlockOperation。 这是NSOperation的一个实现,可以通过一个块进行参数化调用。

正如苹果公司的doc一样, NSInvocationOperationNSBlockOperation都是NSBlockOperation的子类

NSInvocationOperation类

NSInvocationOperation类是NSOperation的一个具体子类,用于pipe理指定为调用的单个封装任务的执行。 您可以使用此类来启动一个操作,该操作包括在指定的对象上调用select器。 这个类实现了非并发操作


NSBlockOperation类

NSBlockOperation类是NSOperation的一个具体子类,它pipe理一个或多个块的并发执行。 您可以使用此对象一次执行多个块,而无需为每个块创build单独的操作对象。 当执行多个块时,操作本身只有在所有块完成执行后才被认为是完成的。

添加到块操作的块将以默认优先级调度到适当的工作队列。 块本身不应该对其执行环境的configuration做任何假设。