0

我发布这个是因为我对某事感到好奇。例如,让我们看一下这个示例代码(仅作为示例):

    -(void)doSomething{
         for (int i=0;i<10000000000;i++){
             nslog(@"%i", int);
         }
         nslog(@"i'm done!");
    }

有什么方法可以for loop在同一个方法(doSomething)中但在另一个线程中执行而不需要执行类似NSOperationQueue@selector)之类的操作?
并且 NSLog 必须在for loop完成后才能执行。
如果有什么东西,示例代码将不胜感激!
谢谢你。

4

3 回答 3

1

是的,您可以将 GCD 与dispatch_async. 但是i'm done在所有迭代完成后,不会执行 NSLog。这没有意义,因为它必须在主(主)线程上等待后台(迭代)线程完成。

如果您不想阻止 UI 的主要方法,则必须在后台线程中执行整个方法。

于 2012-05-30T22:54:03.933 回答
0

您正在编写的代码的性质是什么?你想加速昂贵的for循环吗?您是希望包含方法在循环完成之前一直阻塞,还是只想NSLog()在循环完成后执行?在不了解更多信息的情况下,以下是您的一些选择:

- (void)doSomething
{
  dispatch_apply(10000000000, dispatch_get_global_queue(), ^(size_t i) {
    NSLog(@"%d", i);
  });

  NSLog(@"I'm done!");
}

或者

- (void)doSomething
{
  dispatch_queue_t calling_queue = dispatch_get_current_queue();
  dispatch_async(dispatch_get_global_queue(), ^{
    for (int i = 0; i < 10000000000; i++)
    {
      NSLog(@"%d", i);
    }

    dispatch_async(calling_queue, ^{
      NSLog(@"I'm done!");
    });
  });
}
于 2012-05-30T23:18:30.143 回答
0

我相信dispatch_asyc按顺序调用传递给它的每个块,所以理论上你可以运行:

for (int i=0;i<10000000;i++){
    dispatch_async(dispatch_get_global_queue(), ^{
        for (int x=i*1000;x<1000;x++){ NSLog(@"%i", x); }
    });
}
dispatch_async(dispatch_get_global_queue(), ^{
    NSLog(@"i'm done!");
}

我还没有测试过,但是一次将这么多项目放在队列中可能会很长。

于 2012-05-31T01:49:50.503 回答