2016-12-05 3 views
1

Возможно ли/законно иметь операции зависимостей в очереди?Можете ли вы использовать кросс-зависимые зависимости для объектов NSOperation?

Рассмотрим следующее ...

let operationA = NSBlockOperation(block: someBlock) 
let operationB = NSBlockOperation(block: someOtherBlock) 

let operationC = NSBlockOperation(block: finalBlock) 
operationC.addDependency(operationA) 
operationC.addDependency(operationB) 

OperationQueue().addOperation(operationC) 
OperationQueue().addOperation(operationA) 
OperationQueue().addOperation(operationB) 

я не видел нигде в документации, говорит, что это ограниченное использование, но я также не уверен, что если такая вещь возможна/поддерживается. (Примечание: Я также не говорю, что если это хорошая практика, или не просто пытаюсь «засунуть» язык, чтобы увидеть, что это возможно в качестве пищи для размышлений.).

ответ

0

Да

«Другой приятной вещи зависимостей в том, что они не ограничены операционными очередями. Теперь, что я имею в виду под этим? Если у вас две очереди операций в приложении, операции в первой очереди могут зависеть от операций во второй очереди ».

https://developer.apple.com/videos/play/wwdc2015/226/

Вот пример, вы можете попробовать:

NSOperationQueue *queue1 = [[NSOperationQueue alloc] init]; 

NSBlockOperation *a1 = [[NSBlockOperation alloc] init]; 

NSBlockOperation *a2 = [[NSBlockOperation alloc] init]; 

[a1 addExecutionBlock:^{ 
    NSLog(@"a1"); 

    NSOperationQueue *queue2 = [[NSOperationQueue alloc] init]; 

    NSBlockOperation *b1 = [[NSBlockOperation alloc] init]; 

    NSBlockOperation *b2 = [[NSBlockOperation alloc] init]; 

    [b1 addExecutionBlock:^{ 
     NSLog(@"b1"); 
    }]; 

    [b2 addExecutionBlock:^{ 
     NSLog(@"b2"); 
    }]; 

    [a2 addDependency:b2]; // makes this inner queue finish first 

    [b2 addDependency:b1]; 

    [queue2 addOperations:@[b1, b2] waitUntilFinished:NO]; 

}]; 

[a2 addExecutionBlock:^{ 
    NSLog(@"a2"); 
}]; 

[a2 addDependency:a1]; 

[queue1 addOperations:@[a1, a2] waitUntilFinished:NO]; 

Выходы:

2017-01-08 00:27:03.019497 OpTest[26141:36238589] a1 
2017-01-08 00:27:03.019621 OpTest[26141:36238621] b1 
2017-01-08 00:27:03.019721 OpTest[26141:36238589] b2 
2017-01-08 00:27:03.019773 OpTest[26141:36238621] a2 

Как вы можете видеть [a2 addDependency:b2] линия позволяет суб-очереди операций, чтобы закончить в течение главной очереди.

Смежные вопросы