2016-12-05 69 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]行允許操作的子隊列內完成主隊列。

相關問題