向 macOS Grand Central Dispatch App 中的信号量发送延迟的 semaphore_signal 是一种好习惯吗?
Is it good practice to send a delayed semaphore_signal to a semaphore in a macOS Grand Central Dispatch App?
我在 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_semaphore_wait 的参数只能是现在或永远,我正在使用 dispatch_after 块来实现超时。您认为这是好的做法还是会导致问题和崩溃?感谢您的帮助。
您从哪里得知 dispatch_semaphore_wait()
的超时只能是现在或永远?那是不正确的。您可以像使用 dispatch_after()
一样传递 dispatch_time()
的结果。因此,没有必要自己实现超时。
我在 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_semaphore_wait 的参数只能是现在或永远,我正在使用 dispatch_after 块来实现超时。您认为这是好的做法还是会导致问题和崩溃?感谢您的帮助。
您从哪里得知 dispatch_semaphore_wait()
的超时只能是现在或永远?那是不正确的。您可以像使用 dispatch_after()
一样传递 dispatch_time()
的结果。因此,没有必要自己实现超时。