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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来自dispatch_async全局崩溃的C函数调用,但在主队列上工作相关的知识,希望对你有一定的参考价值。

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

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

我不知道为什么它崩溃,任何帮助表示赞赏。

答案

任何涉及macOS GUI或处理文本的调用,包括键翻译器,文本输入源和对文本服务管理器的任何调用都应在主线程上完成,否则您可能会崩溃。我不知道该库的依赖性,但你应该寻找我在这里提到的任何东西。如果你有它们,那么你应该构建一个XPC服务来在主线程上处理它,而不是阻止你的UI。

另一答案

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

以上是关于来自dispatch_async全局崩溃的C函数调用,但在主队列上工作的主要内容,如果未能解决你的问题,请参考以下文章

Dispatch Queue 之 dispatch_async

攻击者思维:再现 dispatch_async 在 Voice Control 崩溃问题

如何在目标 c 中使用 GCD dispatch_async 调用/编写以下方法

reloadRowsAtIndexPaths 使用 JSON imageUrls 崩溃

c语言工程里其它文件引用全局变量?

使用全局函数启动后立即崩溃