18

Foundation Framework 中有三个操作类(NSOperationNSInvocationOperationNSBlockOperation

我已经阅读了并发编程指南,但我并不完全理解这三个类之间的区别。请帮我。

4

3 回答 3

34

NSBlockOperation执行一个块。NSInvocationOperation执行一个NSInvocation(或由目标、选择器、对象定义的方法)。NSOperation必须子类化,它提供了最大的灵活性,但需要的代码最多。

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

对于大多数任务来说,使用 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];
}
于 2013-09-05T09:19:57.367 回答
4

与 Apple doc 一样NSInvocationOperationNSBlockOperation两者都是NSOperation

NSInvocationOperation 类

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


NSBlockOperation 类

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

添加到块操作的块以默认优先级分派到适当的工作队列。块本身不应对其执行环境的配置做出任何假设。

于 2013-09-05T09:17:23.850 回答
4

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

但是,对于简单的情况,这(创建自己的子类)不是必需的。

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

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

于 2013-09-05T09:17:35.097 回答