Llu*_*uís -3 concurrency cocoa objective-c grand-central-dispatch
这是我的第一个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;
}
Run Code Online (Sandbox Code Playgroud)
第一.您的应用程序实际上会在您在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;
Run Code Online (Sandbox Code Playgroud)
第二.在这里,您将遇到另一个称为死锁的问题.第二个块被添加到主线程队列中.并且主线程实际上正在等待此块完成,因此无法执行.将第二个块添加到之前创建的队列中.
dispatch_group_async(group, queue, ^{
printResult(number);
});
Run Code Online (Sandbox Code Playgroud)
现在你可以32在控制台中看到,这是你所期望的.
| 归档时间: |
|
| 查看次数: |
265 次 |
| 最近记录: |