【问题标题】:How to dispatch C function from objective-c method asynchronously如何从objective-c方法异步调度C函数
【发布时间】:2016-09-16 17:58:39
【问题描述】:

我的 iOS 应用程序使用 C 函数进行某些计算。我想从 -(void)viewDidLoad 但我不希望它冻结主线程。我尝试用 dispatch_async(dispatch_get_main_queue... 块调用它,但它仍然在主线程上被调用。还包括对 Objective-c 方法的函数调用和调用 [self performSelector: InBackground] 也不起作用。请帮忙。是有什么办法可以在 Objective-C 应用程序的后台执行 C 函数?

【问题讨论】:

  • dispatch_get_main_queue() 是问题所在。您必须使用不同的队列。
  • 您应该阅读 Apple 的线程指南。如果您希望它在后台运行,则将某些内容放在主线程上是没有意义的。此外, performSelectorInBackground: 将起作用(显然,您需要将 C 代码封装在 Obj-C 函数中才能使用它)。
  • 是的,将其放在后台队列中有效。但是使用 objc 方法封装的函数的 performSelectorInBackground 没有。

标签: ios objective-c c multithreading


【解决方案1】:

或者您可以将其放入 obj-c 方法并使用以下方法调用:

[NSThread detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument];

【讨论】:

    【解决方案2】:

    你必须使用不同的队列,例如:

    dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_async(backgroundQueue, ^{
       // do something
    });
    

    更多详情请见Dispatch Queues

    【讨论】:

    • 太棒了。在自定义队列上调度它是有效的。谢谢。
    猜你喜欢
    • 2022-01-02
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多