В прошлой статье про 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 только цифры?