来自dispatch_async全局的C函数调用崩溃,但在主队列上有效

时间:2018-09-21 14:44:31

标签: objective-c macos garbage-collection grand-central-dispatch

enter image description here我面临一个奇怪的问题,如果我从调度全局队列中调用c静态库函数,则代码将在C库中崩溃。但是,如果我从主线程调用相同的代码,它将成功运行。下面是代码片段的摘要:-

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
// Below is the C code
int returnCode = calculate_feature_vector([dest_folder UTF8String],[dest_path 
UTF8String],feature_vector);
   dispatch_async(dispatch_get_main_queue(), ^{
    completion(distanceMap);
});

不知道为什么崩溃,不胜感激。

2 个答案:

答案 0 :(得分:0)

任何涉及macOS GUI或处理文本的调用,包括按键翻译器,文本输入源以及对文本服务管理器的任何调用,均应在主线程上进行,否则可能会崩溃。我不知道该库的依赖关系,但是您应该寻找我在这里提到的任何内容。如果有它们,则应构建一个XPC服务以在主线程上处理此问题,而不是阻塞UI。

答案 1 :(得分:0)

我现在可以解决此问题。解决方案是将c代码包装在目标c类中,然后从调度队列中调用目标c代码。以前我是直接从调度队列中调用c代码的。