Подтвердить что ты не робот

В чем разница между NSInvocationOperation и NSBlockOperation

В Foundation Framework существует три класса операций (NSOperation, NSInvocationOperation и NSBlockOperation).

Я уже читал concurrency руководство по программированию, но я точно не понял, в чем разница между этими тремя классами. Пожалуйста, помогите мне.

4b9b3361

Ответ 1

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

Ответ 2

Как par Apple doc NSInvocationOperation и NSBlockOperation Оба являются подклассами NSOperation

Класс NSInvocationOperation

Класс NSInvocationOperation - это конкретный подкласс NSOperation, который управляет выполнением одной инкапсулированной задачи, указанной как вызов. Вы можете использовать этот класс для запуска операции, состоящей в вызове селектора на указанном объекте. Этот класс реализует неконкурентную операцию


Класс NSBlockOperation

Класс NSBlockOperation представляет собой конкретный подкласс NSOperation, который управляет одновременным выполнением одного или нескольких блоков. Вы можете использовать этот объект для одновременного выполнения нескольких блоков без создания отдельных рабочих объектов для каждого. При выполнении более одного блока сама операция считается завершенной только после завершения всех блоков.

Блоки, добавленные в операцию блока, отправляются с приоритетом по умолчанию в соответствующую рабочую очередь. Сами блоки не должны делать каких-либо предположений о конфигурации их среды выполнения.

Ответ 3

NSOperation - базовый класс. Все операции расширяют NSOperation. Но это абстрактный класс, что означает, что вам нужно подклассифицировать его и реализовать код, который выполняет фактическую операцию.

Для простых случаев это (создание собственного подкласса), однако, необязательно.

Если вы просто хотите передать сообщение объекту, вы можете использовать NSInvocationOperation. Это реализация NSOperation, которая может быть параметризована с помощью селектора и целевого объекта.

Если вы просто хотите вызвать еще один блок, вы можете использовать NSBlockOperation. Это реализация NSOperation, которая может быть параметризована блоком для вызова.