Обсуждение

Обсуждение

Выполнение операции не начинается до тех пор, пока не будут успешно завершены все операции, от которых она зависит. По умолчанию после инициализации операция не связана зависимостями с какими-либо другими операциями.

Если мы хотим внедрить зависимости в пример с кодом, описанный в разделе 7.12, то можем немного изменить реализацию делегата приложения и воспользоваться методом экземпляра addDependency:, чтобы первая операция дождалась окончания выполнения второй операции:

#import «AppDelegate.h»

@interface AppDelegate ()

@property (nonatomic, strong) NSInvocationOperation *firstOperation;

@property (nonatomic, strong) NSInvocationOperation *secondOperation;

@property (nonatomic, strong) NSOperationQueue *operationQueue;

@end

@implementation AppDelegate

— (void) firstOperationEntry:(id)paramObject{

NSLog(@"First Operation — Parameter Object = %@",

paramObject);

NSLog(@"First Operation — Main Thread = %@",

[NSThread mainThread]);

NSLog(@"First Operation — Current Thread = %@",

[NSThread currentThread]);

}

— (void) secondOperationEntry:(id)paramObject{

NSLog(@"Second Operation — Parameter Object = %@",

paramObject);

NSLog(@"Second Operation — Main Thread = %@",

[NSThread mainThread]);

NSLog(@"Second Operation — Current Thread = %@",

[NSThread currentThread]);

}

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

NSNumber *firstNumber = @111;

NSNumber *secondNumber = @222;

self.firstOperation = [[NSInvocationOperation alloc]

initWithTarget: self

selector:@selector(firstOperationEntry:)

object: firstNumber];

self.secondOperation = [[NSInvocationOperation alloc]

initWithTarget: self

selector:@selector(secondOperationEntry:)

object: secondNumber];

[self.firstOperation addDependency: self.secondOperation];

self.operationQueue = [[NSOperationQueue alloc] init];

/* Добавляем операции в очередь. */

[self.operationQueue addOperation: self.firstOperation];

[self.operationQueue addOperation: self.secondOperation];

NSLog(@"Main thread is here");

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Теперь после запуска программ вы увидите в окне консоли примерно следующее:

Second Operation — Parameter Object = 222

Main thread is here

Second Operation — Main Thread = <NSThread: 0x68 10250>{name = (null),

num = 1}

Second Operation — Current Thread = <NSThread: 0x6836ab0>{name = (null),

num = 3}

First Operation — Parameter Object = 111

First Operation — Main Thread = <NSThread: 0x68 10250>{name = (null),

num = 1}

First Operation — Current Thread = <NSThread: 0x6836ab0>{name = (null),

num = 3}

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

Если вы в любой момент пожелаете разорвать зависимость между двумя операциями, воспользуйтесь методом экземпляра removeDependency:, относящимся к объекту операции.

Данный текст является ознакомительным фрагментом.