Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 将代码转换为大中央调度_Cocoa_Grand Central Dispatch - Fatal编程技术网

Cocoa 将代码转换为大中央调度

Cocoa 将代码转换为大中央调度,cocoa,grand-central-dispatch,Cocoa,Grand Central Dispatch,我有一个NSN号码数组,必须通过20次测试。如果一个测试失败,则该数组无效;如果所有测试都通过,则该数组无效。我正在尝试这样做,一旦第一次失败发生,它就会停止进行剩余的测试。如果第三次测试失败,则停止评估其他测试 我正试图将我的串行处理代码转换为带有grand central dispatch的并行处理,但我不能对此束手无策 这就是我所拥有的 首先是要进行的测试的定义。此数组用于运行测试 每个单独的测试失败时返回YES,正常时返回NO #define TESTS @[ \

我有一个NSN号码数组,必须通过20次测试。如果一个测试失败,则该数组无效;如果所有测试都通过,则该数组无效。我正在尝试这样做,一旦第一次失败发生,它就会停止进行剩余的测试。如果第三次测试失败,则停止评估其他测试

我正试图将我的串行处理代码转换为带有grand central dispatch的并行处理,但我不能对此束手无策

这就是我所拥有的

首先是要进行的测试的定义。此数组用于运行测试

每个单独的测试失败时返回YES,正常时返回NO

#define TESTS  @[         \
    @"averageNotOK:",     \
    @"numbersOverRange:", \
    @"numbersUnderRange:",\
    @"numbersForbidden:", \
    // ... etc etc
    @"numbersNotOnCurve:"]


- (BOOL) numbersPassedAllTests:(NSArray *)numbers {

  NSInteger count = [TESTS count];

  for (int i=0; i<count; i++) {

    NSString *aMethodName = TESTS[i];

        SEL selector = NSSelectorFromString(aMethodName);

        BOOL failed = NO;

        NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector];

        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
        [invocation setSelector:selector];
        [invocation setTarget:self];
        [invocation setArgument:&numbers atIndex:2];
        [invocation invoke];


        [invocation getReturnValue:&failed];

        if (failed) {
          return NO;
        }
  }
  return YES;

}
#定义测试@[\
@“阿维根诺托克:”\
@“数字超出范围:”\
@“数字欠范围:”\
@“禁止使用号码:”\
//…等等
@“NumbersNotuncurve:”]
-(BOOL)编号通过所有测试:(NSArray*)编号{
NSInteger计数=[测试计数];

对于(int i=0;i我假设您已经发现了
dispatch\u apply
,这是一个微不足道的并行程序。您已经意识到它不能提前退出。因此,问题就来了

恐怕答案是你需要自己做一些簿记工作,但幸运的是这不会太难。为了避免重复你所得到的,请假装我已将你循环中的内容变成:

BOOL failedTest(int);
因此,您的串行循环如下所示:

for (int i=0; i<count; i++) {

    if(failedTest(i))
      return NO;
}

return YES;

for(inti=0;我知道,你的代码正在融化我的大脑!让我看看我是否理解。hasfiled是一个整数,但你用它作为布尔值,并用开放的命令osatomiciincrement32递增它(为什么不是64?我是为mavericks开发的).当这个变量是1,kaput,end.我的问题是这样的。在我的例子中,
numbersPassedAllTests:
是从代码的另一部分调用的,那么你的代码呢?我是否将它放在返回BOOL的方法中?我如何从代码的另一部分调用它?continuation.你提到的簿记是什么意思h、 只是你正在手动跟踪
hasfiled
,所有后续块仍在调度,但如果其他人已经宣布它们失败,则选择不做任何工作。是的,将其放入函数或任何从任何地方调用的东西中。很抱歉,我看不到你的代码如何使用dispatch\u apply工作,如果你你正在用它来代替我的循环,除非你想让我用这个结构作为我正在做的每一个测试的结构。你的意思是什么?如果不是,我就不知道如何在那里适应我的循环。
dispatch\u apply
是一个并行for循环。它可以直接代替任何标准的
for
循环。所以,是的,你会这样使用它。你的
TESTS
macro太糟糕了……是的,我知道,我也讨厌它,但它仍在开发中。你有什么建议?
SEL TESTS[]={@selector(averageNotOK:)};
ah,你的意思是创建一个C选择器数组吗?好的,我会试试。谢谢。
#import <libkern/OSAtomic.h>

volatile __block int32_t hasFailed = 0;
dispatch_apply(
    count, 
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), 
    ^(size_t i)
    {
        // do no computation if somebody else already failed
        if(hasFailed) return;
        if(failedTest(i))
            OSAtomicIncrement32(&hasFailed);
    });

return !hasFailed;