Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/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
Objective c 好奇:在同一方法内的另一个线程中执行代码?_Objective C_Xcode_Multithreading_Macos_Cocoa - Fatal编程技术网

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

Objective c 好奇:在同一方法内的另一个线程中执行代码?,objective-c,xcode,multithreading,macos,cocoa,Objective C,Xcode,Multithreading,Macos,Cocoa,我之所以发布这篇文章,是因为我对一些事情很好奇。 例如,让我们来看看这个示例代码(作为一个例子): -(无效)剂量测量{ 对于(int i=0;i是的,您可以将GCD与dispatch\u async一起使用。但是i'm doneNSLog不会在所有迭代完成后执行。这没有意义,因为它必须在主(主)线程上等待后台(迭代)线程完成 如果您不想阻止UI的主方法,则必须在后台线程中执行整个方法。您正在编写的代码的性质是什么?您想加速昂贵的for循环吗?您想阻止包含方法直到循环完成,还是只想执行NSLog

我之所以发布这篇文章,是因为我对一些事情很好奇。 例如,让我们来看看这个示例代码(作为一个例子):

-(无效)剂量测量{

对于(int i=0;i是的,您可以将GCD与
dispatch\u async
一起使用。但是
i'm done
NSLog不会在所有迭代完成后执行。这没有意义,因为它必须在主(主)线程上等待后台(迭代)线程完成


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

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

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

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

-(无效)剂量测量
{
dispatch_queue_t calling_queue=dispatch_get_current_queue();
dispatch\u async(dispatch\u get\u global\u queue()^{
对于(int i=0;i<1000000000;i++)
{
NSLog(@“%d”,i);
}
调度异步(调用队列^{
NSLog(@“我完了!”);
});
});
}

我相信
dispatch\u 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!");
}

用于(int i=0;从技术上讲,
dispatch\u sync
可以在另一个线程上运行循环,并阻塞直到完成,让NSLog只在完成后运行。@Mattwiding我同意,但为什么要在另一个线程中等待,而在后台代码执行后,您必须在主线程上执行代码?我只是指出了一个技术问题。否则我完全同意你的观点;这似乎没有什么意义,尤其是在那个例子中。请注意
dispatch\u get\u current\u queue()
的行为相当……不同……取决于调用它的线程和/或队列。在使用该方法之前,请仔细阅读文档。@bbum:如果你能扩展一下,我会很高兴的!上面的代码与我以前编写的代码有点类似,我想知道其中可能存在的问题。我应该重新考虑这个问题吗正在处理队列/存在死锁机会/其他问题?请参阅调度\u获取\u当前\u队列()的手册页它解释了不同的可能返回值。并发队列的性质是,在它之前排队的块之前不会启动任何块,但它可以同时运行,从而首先完成。因此,无法保证在所有for循环完成之前不会打印“我完成了”。
- (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!");
    });
  });
}
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!");
}