根据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 的信号量。
- 当你想运行时,你会等待信号量,如果信号量的值为 0,你的线程就会被阻塞,对于 > 0,计数会递减,线程会继续
- 工作完成后,您向信号量发出信号 - 信号量会增加
HTH
关于objective-c - 重置dispatch_once_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21613135/