从 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 获得价值?的主要内容,如果未能解决你的问题,请参考以下文章