В прошлой статье про NSOperation и NSOperationQueue было показано как создавать операции через наследование. В этой статье мы рассмотрим еще два способа создания операций — NSBlockOperation и NSInvocationOperation.

NSBlockOperation

Эта операция оборачивает в себе один или несколько блоков кода. Блоки не должны иметь входных аргументов и не должны возвращать какого-либо значения. NSBlockOperation может содержать в себе несколько блоков. Рассмотрим создание операции:


NSBlockOperation* blockOperation = [NSBlockOperation blockOperationWithBlock:^{
// TOOD: код операции
}];

Блок кода, который мы обернули в операции можно сопоставить с методом main в операции созданной через наследование.

Чтобы добавить к операции еще один блок кода нужно вызвать метод addExecutionBlock: :


[blockOperation addExecutionBlock:^{
// TODO: код
}];

Добавлять блоки можно только если операция еще не запущена. Если операция уже запущена и мы добавляем блок кода, то получим исключение NSInvalidArgumentException.

Так же мы можем получить все блоки кода добавленные в операцию через свойство executionBlocks:


NSArray* blocks = blockOperation.executionBlocks;

NSBlockOperation наследованна от NSOperation и обладает всеми характерными для операции свойствами. Напомню, чтобы добавить операцию в очередь нужно вызвать метод addOperation: у очереди.


NSOperationQueue* queue = ... ;
[queue addOperation:blockOperation];

NSInvocationOperation

NSInvocationOperation позволяет превратить метод любого класса в операцию. Метод может принимать параметр на вход и возвращать результат (через return). Предположим у нас есть метод operationMethod и мы хотим обернуть его в операцию:


-(void) someMethod {
NSInvocationOperation* operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationMethod) object:nil];
}
-(void) operationMethod {
// код метода-операции
}

Теперь, если мы запустим операцию — будет вызван метод. В метод мы так же можем передать объект и получить разультат выполнения. Результат будет содержаться в свойстве result у NSInvocationOperation если операция завершилась, если нет — будет возвращен nil.


-(void) someMethod {
NSOperationQueue* queue = ...;
NSString* someString = @"someString";

NSInvocationOperation* operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationMethod) object:someString];
[queue addOperation:operation];
}
-(NSString*) operationMethod:(NSString*)inStr {
return inStr;
}

После выполнения операции мы можем получить результат через свойство result.

Создать NSInvocationOperation можно и через NSInvocation:


-(void) someMethod {
NSInvocationOperation* operation = [[NSInvocationOperation alloc] initWithInvocation:[NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(operationMethod)]]];
}
-(void) operationMethod {

}

Похожие статьи

  • Audio Unit в iOS. Часть 3, накладываем эффект Delay

  • Audio Unit в iOS. Часть 2, строим граф и проигрываем файлы

  • Audio Unit в iOS. Часть 1, введение.

  • Используем Emoji в своих приложениях

  • Как вводить в UITextField только цифры?


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *