Objective c 在macOS Grand Central Dispatch应用程序中向信号机发送延迟信号量_信号是一种良好的做法吗?

Objective c 在macOS Grand Central Dispatch应用程序中向信号机发送延迟信号量_信号是一种良好的做法吗?,objective-c,cocoa,grand-central-dispatch,objective-c-blocks,Objective C,Cocoa,Grand Central Dispatch,Objective C Blocks,我正在macOS Objective-C应用程序中使用信号量和GCD。我有一个共同的场景: dispatch_semaphore_t fd_sema = dispatch_semaphore_create(0); dispatch_async(dispatch_get_main_queue(), ^{ // Perform some activity // But can potentially never complete dispatch

我正在macOS Objective-C应用程序中使用信号量和GCD。我有一个共同的场景:

dispatch_semaphore_t fd_sema = dispatch_semaphore_create(0);

dispatch_async(dispatch_get_main_queue(), ^{

        // Perform some activity
        // But can potentially never complete

        dispatch_semaphore_signal(fd_sema);
});

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        dispatch_semaphore_signal(fd_sema);
});

dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);

基本上,这里我试图获得一个操作的超时。假设dispatch\u semaphore\u wait的参数只能是now或ever,我将使用dispatch\u after块来实现超时。您认为这是一种良好的做法,还是会导致问题和崩溃?谢谢您的帮助。

您从哪里知道
dispatch\u semaphore\u wait()
上的超时只能是现在或永远?那是不对的。您可以通过
dispatch\u time()
传递结果,就像使用
dispatch\u after()
一样。因此,不需要自己实现超时。

您从哪里知道
dispatch\u semaphore\u wait()
上的超时只能是现在或永远?那是不对的。您可以通过
dispatch\u time()
传递结果,就像使用
dispatch\u after()
一样。因此,不需要自己实现超时。

您的活动真的永远不会完成吗?然后,将线程放在全局调度队列中可能会永久性地浪费线程。既然它可能很慢,为什么您现在要在主队列上执行此操作?似乎是个坏主意。你的活动真的永远不会完成吗?然后,将线程放在全局调度队列中可能会永久性地浪费线程。既然它可能很慢,为什么您现在要在主队列上执行此操作?似乎是个坏主意。那是在我的眼皮底下!可能是深夜:),但我试着查看标题时,发现了一个不透明的时间结构,只能以文档化的方式设置为现在或永远。当然,这并不完全是这里使用的时间结构。谢谢!那是在我的眼皮底下!可能是深夜:),但我试着查看标题时,发现了一个不透明的时间结构,只能以文档化的方式设置为现在或永远。当然,这并不完全是这里使用的时间结构。谢谢!