NSInvocationOperation和NSBlockOperation有什么区别?
Foundation Framework中有三个操作类( NSOperation
, NSInvocationOperation
和NSBlockOperation
)。
我已经阅读了并发编程指南,但是我不明白这三个类之间究竟有什么区别。 请帮帮我。
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一样, NSInvocationOperation
和NSBlockOperation
都是NSBlockOperation
的子类
NSInvocationOperation类
NSInvocationOperation类是NSOperation的一个具体子类,用于pipe理指定为调用的单个封装任务的执行。 您可以使用此类来启动一个操作,该操作包括在指定的对象上调用select器。 这个类实现了非并发操作
NSBlockOperation类
NSBlockOperation类是NSOperation的一个具体子类,它pipe理一个或多个块的并发执行。 您可以使用此对象一次执行多个块,而无需为每个块创build单独的操作对象。 当执行多个块时,操作本身只有在所有块完成执行后才被认为是完成的。
添加到块操作的块将以默认优先级调度到适当的工作队列。 块本身不应该对其执行环境的configuration做任何假设。