NSInvocationOperation和NSBlockOperation之间有什么区别

时间:2013-09-05 09:11:43

标签: iphone ios objective-c nsoperation

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

我已经阅读了concurrency programming guide,但我不明白这三个类之间究竟有什么区别。请帮我。

3 个答案:

答案 0 :(得分:30)

NSBlockOperation表示一个块。 NSInvocationOperation执行NSInvocation(或由target,selector,object定义的方法)。 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];
}

答案 1 :(得分:3)

作为标准Apple文档NSInvocationOperationNSBlockOperation两者都是NSOperation的子类

NSInvocationOperation Class

  

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


NSBlockOperation Class

  

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

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

答案 2 :(得分:3)

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

对于简单的情况,不需要这个(制作自己的子类)。

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

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