ios - 如何确定是否正在等待调度信号量?

标签 ios objective-c multithreading grand-central-dispatch semaphore

如何确定 dispatch_semaphore_t 是否正在等待而导致等待?我最初在想:

if ( dispatch_semaphore_wait(mySemaphore, DISPATCH_TIME_NOW) ) {
    NSLog(@"No more resources, wait");
} else {
    NSLog(@"Resources available, shouldn't wait");
}

但是执行 dispatch_semaphore_wait() 时信号量会递减,所以我在想:

if ( dispatch_semaphore_wait(mySemaphore, DISPATCH_TIME_NOW) ) {
    NSLog(@"No more resources, wait");
} else {
    dispatch_semaphore_signal(mySemaphore);
    NSLog(@"Resources available, shouldn't wait");
}

哪个具有不递减信号量的最终结果但看起来像是 hack,建议?

编辑

当我输入我正在做的事情以及我是如何得出这个结论时,我意识到我确实以错误的方式思考解决方案,我只是想知道我是否正在等待资源并且能够向用户显示“等待”对话框。我认为这是正确的方法:

    [self showWait];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_semaphore_wait(mySemaphore, DISPATCH_TIME_FOREVER);
        dispatch_async(dispatch_get_main_queue(), ^{
            [self hideWait];
        });
    });

最佳答案

dispatch_semaphore_wait() 仅在返回 0 时递减信号量值。

如果超时已过期(即返回非零值),则信号量值尚未递减。

将成功案例中的递减视为获得由计数信号量管理的资源之一的所有权,如果您在成功等待后立即发出信号,则表示您已立即停止使用该资源,这大概是不是你想要的。

你想做什么?

关于ios - 如何确定是否正在等待调度信号量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799288/

相关文章:

iOS 确认 UIAlertView 在 "Are you sure?"设置 App

ios - UIView 动画不起作用

ios - 从 ViewController( Storyboard)调用 NavigationController (xib)

c++ - 在线程中调用时 memcpy 变慢

iphone - 将图片发送到iMovie iPhone应用程序

objective-c - 为核心数据写入创建后台线程

ios - 如何将 Swift CocoaPods 与桥接头文件集成

c# - 在 C# 中监视与互斥锁

c++ - 如何避免线程+优化器==无限循环?

ios - 删除特定对象 Realm Swift