Я использую семафоры и GCD в приложении Objective-C macOS. У меня есть общий сценарий:Хорошая практика отправить задержанный semaphore_signal в семафор в MacOS Grand Central Dispatch App?
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 для реализации тайм-аута. Считаете ли вы, что это хорошая практика или это может привести к проблемам и сбоям? Спасибо за любую помощь.
Может ли ваша деятельность действительно * никогда не завершить? Тогда вы можете постоянно тратить поток, помещая его в глобальную очередь отправки. Поскольку это может быть медленным, почему вы сейчас делаете это в ** основной ** очереди? Кажется, плохая идея. – jtbandes