swift - 你能为 NSOperation 对象使用跨队列依赖吗?

标签 swift dependencies nsoperation nsoperationqueue

跨队列依赖操作是否可能/合法?

考虑以下...

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)

我在文档中没有看到任何地方说这是一个受限的用法,但我也不确定是否可能/支持这样的事情。 (注意:我也不是说这是否是好的做法。只是尝试“戳”一下语言,看看有什么可能作为思考的食物。)

最佳答案

“依赖性的另一个巧妙之处在于它们不受操作队列的限制。现在,我的意思是什么?如果您的应用程序中有两个操作队列,则第一个队列中的操作可以依赖于操作在第二个队列中。”

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] 行允许操作的子队列在主队列中完成。

关于swift - 你能为 NSOperation 对象使用跨队列依赖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40983203/

相关文章:

ios - 从非导航 Controller View Controller 返回时,通过在屏幕上的任意位置滑动来退出导航项无法按预期工作

ios - 无法点击自定义按钮 Swift

ios - 选项卡栏为更多选项卡选择索引

javascript - node.js TypeError : path must be absolute or specify root to res. sendFile [无法解析JSON]

nsoperation - 如何取消UIActivityItemProvider并且不显示事件?

ios - 如何使用自定义相机捕捉视频

java - Ivy 依赖项(拉入文件目录)

dependencies - 通过gradle将依赖关系jar和主要 Artifactory 一起发布到 Artifactory

ios - 核心数据的 NSOperation VS GCD

iphone - NSOperation mainQueue 问题