好奇心:在同一个方法中的另一个线程中执行代码?

时间:2012-05-30 22:52:08

标签: objective-c xcode multithreading macos cocoa

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

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

有没有办法在同一方法(for loop)中执行doSomething,但在另一个线程中执行NSOperationQueue@selector)之类的操作?
只有在for loop完成后才能执行NSLog。
如果有什么东西,示例代码将不胜感激!
谢谢。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您正在撰写的代码的性质是什么?你想加快昂贵的for循环吗?你想要在循环完成之前阻塞contains方法,还是只想在循环结束后执行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!");
    });
  });
}

答案 2 :(得分: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!");
}

我没有对此进行过测试,但是将这么多项目放在队列中可能会有所延伸。