NSInvocationOperation和NSBlockOperation的区别是什么?

18

在 Foundation 框架中有三个操作类(NSOperationNSInvocationOperationNSBlockOperation)。

我已经阅读了并发编程指南,但是我不太明白这三个类之间的区别。请帮助我。

3个回答

34

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

NSBlockOperationNSInvocationOperation都是NSOperation的子类。它们由系统提供,因此您无需为简单任务创建新的子类。

对于大多数任务,使用NSBlockOperationNSInvocationOperation应该足够了。


以下是一个代码示例,演示了如何使用这三种方式实现完全相同的功能:

// 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];
}

2
如果您在每个操作中使用不同的文本来区分它们而不是一遍又一遍地使用“Hello World”,那就太好了。这只是一个建议。 - C0D3

4
根据苹果文档,NSInvocationOperationNSBlockOperation都是NSOperation的子类。 NSInvocationOperation Class

NSInvocationOperationNSOperation的一个具体子类,用于管理执行单个任务的调度。您可以使用此类来启动调用指定对象上的选择器的操作。该类实现了非并发操作。


NSBlockOperation类

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

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


4

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

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

如果您只想向对象传递消息,则可以使用NSInvocationOperation。这是NSOperation的一种实现,可以用选择器和目标对象参数化。

如果您只想调用一个或多个块,则可以使用NSBlockOperation。这是NSOperation的一种实现,可以用块参数化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接