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!");
}