这是我的第一个Grand Central Dispatch代码,但它不起作用。使用Mac OS X 10.8和最新的Xcode版本。我知道这太基础了。感谢。
#import <Foundation/Foundation.h>
#import <dispatch/dispatch.h>
void printResult(int r);
void printResult(int r)
{
NSLog(@"%i", r);
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);
dispatch_async(queue, ^{
int number = pow(2, 5);
dispatch_async(dispatch_get_main_queue(), ^{
printResult(number);
});
});
}
return 0;
}
答案 0 :(得分:5)
首先。您的应用程序实际退出之前您在GCD中传递的块可以完成。
要解决此问题,您可以使用GCD 群组以及他们为您提供的同步工具。
@autoreleasepool {
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);
dispatch_group_async(group, queue, ^{
int number = pow(2, 5);
dispatch_group_async(group, dispatch_get_main_queue(), ^{
printResult(number);
});
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
}
return 0;
二。在这里,您将遇到另一个名为死锁的问题。第二个块被添加到主线程队列中。并且主线程实际上等待此块完成,因此无法执行。将第二个块添加到之前创建的队列中。
dispatch_group_async(group, queue, ^{
printResult(number);
});
现在您可以在控制台中看到32
,这正是您所期望的。
答案 1 :(得分:0)
int main(int argc, const char * argv[])
{
@autoreleasepool {
dispatch_queue_t queue = dispatch_queue_create("com.myQueue", NULL);
dispatch_async(queue, ^{
int number = pow(2, 5);
dispatch_async(dispatch_get_main_queue(), ^{
printResult(number);
});
});
}
[[NSRunLoop currentRunLoop] run];
return 0;
}
我认为你只需要一个runloop。