我发布这个是因为我对某事感到好奇。 例如,让我们看看这个示例代码(仅作为示例):
-(void)doSomething{
for (int i=0;i<10000000000;i++){
nslog(@"%i", int);
}
nslog(@"i'm done!");
}
有没有办法在同一方法(for loop
)中执行doSomething
,但在另一个线程中执行NSOperationQueue
(@selector
)之类的操作?
只有在for loop
完成后才能执行NSLog。
如果有什么东西,示例代码将不胜感激!
谢谢。
答案 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!");
}
我没有对此进行过测试,但是将这么多项目放在队列中可能会有所延伸。