从 NSBlockOperation 获得价值?

Posted

技术标签:

【中文标题】从 NSBlockOperation 获得价值?【英文标题】:getting value from a NSBlockOperation? 【发布时间】:2013-12-20 22:20:19 【问题描述】:

大家好,我很沮丧,因为我想改进代码但我没有得到好的结果这是我的一段代码

NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock: ^
        value1 = [self getDiferences:0.0 finx:width iniy:0.0 finy:cuartoheith image:imagen1 imagetoComapare:imagen2];
    ];
    [queue addOperation:blockOperation1];

NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock: ^
        value2 = [self getDiferences:0.0 finx:width iniy:0.0 finy:cuartoheith image:imagen1 imagetoComapare:imagen2];
    ];
    [queue addOperation:blockOperation2];

NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock: ^
        value3 = [self getDiferences:0.0 finx:width iniy:0.0 finy:cuartoheith image:imagen1 imagetoComapare:imagen2];
    ];
    [queue addOperation:blockOperation3];

NSBlockOperation *blockOperation4 = [NSBlockOperation blockOperationWithBlock: ^
        value4 = [self getDiferences:0.0 finx:width iniy:0.0 finy:cuartoheith image:imagen1 imagetoComapare:imagen2];
    ];
    [queue addOperation:blockOperation4]; 

我想在 NSBlockOperation 之外使用这个值,比如这个 valuetotal=value1+value2+value3+value4;请帮助或提供更好的解决方案

【问题讨论】:

我希望你用__block 修饰符声明你的value 变量?那么为什么不使用 GCD 和 dispatch_group 来执行操作呢? 是的,我在块之前声明了 __block 浮点值但为空 【参考方案1】:

添加另一个依赖于您的其他操作的操作(使用addDependency:),并在那里添加您的代码。将此操作排队。它将等待所有其他人完成,然后使用他们的输出。

例如,

NSBlockOperation *blockOperationFinal = [NSBlockOperation blockOperationWithBlock: ^
    valueTotal = value1 + value2 + value3 + value4;
];

[blockOperationFinal addDependency:blockOperation1];
[blockOperationFinal addDependency:blockOperation2];
[blockOperationFinal addDependency:blockOperation3];
[blockOperationFinal addDependency:blockOperation4];

[queue addOperation:blockOperationFinal]; 

【讨论】:

我是个新手,所以我不明白你想说什么,如果不是那么麻烦,一段代码会很有帮助 XD 感谢示例代码,但我的问题仍然存在,因为我需要在所有块之外的值总计进行比较 XD 您必须将比较移动到新块操作中,或者以其他方式同步。这是我在这里找到的最简单的。你也可以在队列本身上使用waitUntilAllOperationsAreFinished,但这会阻塞你的调用线程——如果它是主线程,这将阻塞GUI。最好将它放在最终操作中。【参考方案2】:

一个block操作就够了,因为它可以添加更多block,并发执行,同时提供一个block在所有block完成时触发,像这样:

NSMutableArray *array = [[NSMutableArray alloc] init];
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^
    [array addObject:@"op1"];
];
[operation addExecutionBlock:^
    [array addObject:@"op2"];
];

[[[NSOperationQueue alloc] init] addOperation:operation];
[operation setCompletionBlock:^
    NSLog(@"array:%@", array);
];

【讨论】:

以上是关于从 NSBlockOperation 获得价值?的主要内容,如果未能解决你的问题,请参考以下文章

NSBlockOperation 的粒度状态

NSBlockOperation 和块中的对象

解析 NSBlockOperation 的 executionBlocks

如何从剑道组合框获得价值

如何获得Radio Buttons的价值?

带有嵌套完成块的 NSBlockOperation