What is the difference between NSInvocationOperation and NSBlockOperation

前端 未结 3 662
臣服心动
臣服心动 2021-02-04 06:11

There are three operation classes in Foundation Framework(NSOperation, NSInvocationOperation and NSBlockOperation).

I already

相关标签:
3条回答
  • 2021-02-04 06:42

    NSOperation is the base class. All operations extend NSOperation. But it is an abstract class, meaning that you need to subclass it and implement the code that performs the actual operation.

    For simple cases, this (making your own subclass) is not necessary, however.

    If you just want to pass a message to an object, you can use NSInvocationOperation. This is an implementation of NSOperation that can be parameterized with a selector and a target object.

    If you just want to call one more blocks, you can use NSBlockOperation. This is an implementation of NSOperation that can be parameterized with a block to call.

    0 讨论(0)
  • 2021-02-04 06:44

    NSBlockOperation exectues a block. NSInvocationOperation executes a NSInvocation (or a method defined by target, selector, object). NSOperation must be subclassed, it offers the most flexibility but requires the most code.

    NSBlockOperation and NSInvocationOperation are both subclasses of NSOperation. They are provided by the system so you don't have to create a new subclass for simple tasks.

    Using NSBlockOperation and NSInvocationOperation should be enough for most tasks.


    Here is a code example for the use of all three that do exactly the same thing:

    // 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];
    }
    
    0 讨论(0)
  • 2021-02-04 06:48

    As par Apple doc NSInvocationOperation and NSBlockOperation Both are subclass of NSOperation

    NSInvocationOperation Class

    The NSInvocationOperation class is a concrete subclass of NSOperation that manages the execution of a single encapsulated task specified as an invocation. You can use this class to initiate an operation that consists of invoking a selector on a specified object. This class implements a non-concurrent operation


    NSBlockOperation Class

    The NSBlockOperation class is a concrete subclass of NSOperation that manages the concurrent execution of one or more blocks. You can use this object to execute several blocks at once without having to create separate operation objects for each. When executing more than one block, the operation itself is considered finished only when all blocks have finished executing.

    Blocks added to a block operation are dispatched with default priority to an appropriate work queue. The blocks themselves should not make any assumptions about the configuration of their execution environment.

    0 讨论(0)
提交回复
热议问题