【问题标题】:getting value from a NSBlockOperation?从 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 浮点值但为空

标签: ios nsoperation nsoperationqueue


【解决方案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);
}];

【讨论】:

    猜你喜欢
    • 2020-01-12
    • 2016-10-20
    • 2018-04-08
    • 2013-11-10
    • 2012-06-24
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多