objective-c - 重置dispatch_once_t?

标签 objective-c cocoa locking

根据the answer of this post ,您不应该重置dispatch_once_t 在测试之外的任何情况下都不是一件好事

假设我有一段代码,我想确保它不可能同时被多个线程调用(例如加载数据)。这不是有效的代码吗:

@interface SomeClass()
{
    dispatch_once_t onceToken;
}
@end

- (void) updateMethod
{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        dispatch_once(&onceToken, ^{
            // Do some data loading in the background.
            ...

            dispatch_async(dispatch_get_main_queue(), ^{
                // Update the UI
                ...

                // Reset the once token. Allow the method to be called again.
                onceToken = 0;
            });
        });
    });
}

这段代码有问题吗?或者应该以其他方式完成?

最佳答案

您不应尝试使用 dispatch_once 来实现此目的。对于此类任务,您应该根据您的需要使用串行队列或某种锁或信号量。

对于第一个选择,您可以并行进行后台加载,但将 UI 更新排队到主队列中,这是一个串行队列,UI 更新应该发生在主队列上。

如果您要求后台加载是串行的,并且将其排队到串行队列中,则可以使用 dispatch_queue_create() 创建一个。

对于第二个选择,GCD 提供了信号量 - dispatch_semaphore_create()dispatch_semaphore_signal()dispatch_semaphore_wait()

概述您:

  1. 创建一个计数为 1 的信号量。
  2. 当你想运行时,你会等待信号量,如果信号量的值为 0,你的线程就会被阻塞,对于 > 0,计数会递减,线程会继续
  3. 工作完成后,您向信号量发出信号 - 信号量会增加

HTH

关于objective-c - 重置dispatch_once_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21613135/

相关文章:

objective-c - 帮助理解多 Controller Cocoa 应用程序

objective-c - 向 Core Data 添加唯一对象

ios - 如何在 ios 中设置 Tabbar 中的图像而不是色调颜色?

objective-c - 带有内置验证的 NSTextField

cocoa - 如何像evernote一样实现NSToolbarItem动画

c++ - getter 函数是否需要互斥体?

.net - 基于 http 的文件系统,支持查找和锁定

.class 的 Java 同步块(synchronized block)

ios - 在哪里释放在同一类的不同方法中使用的 NSArray

ios - 触摸时 Sprite 不可见