作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有多个调用特定方法的资源,但我想确保(每个对象)仅被调用一次
我想使用类似的语法
// method called possibly from multiple places (threads)
-(void)finish
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[self _finishOnce]; // should happen once per object
});
}
// should only happen once per object
-(void)_finishOnce{...}
@interface MyClass;
@property (nonatomic,strong) dispatch_queue_t dispatchOnceSerialQueue; // a serial queue for ordering of query to a ivar
@property (nonatomic) BOOL didRunExactlyOnceToken;
@end
@implementation MyClass
-(void)runExactlyOnceMethod
{
__block BOOL didAlreadyRun = NO;
dispatch_sync(self.dispatchOnceSerialQueue, ^{
didAlreadyRun = _didRunExactlyOnceToken;
if (_didRunExactlyOnceToken == NO) {
_didRunExactlyOnceToken = YES;
}
});
if (didAlreadyRun == YES)
{
return;
}
// do some work once
}
最佳答案
Avner,您现在可能后悔自己已经问过了;-)
关于对问题的编辑,并考虑到其他问题,您或多或少地重新创建了“老派”方式,也许这正是您应该做的(直接键入代码,期待输入错误) ):
@implemention RACDisposable
{
BOOL ranExactlyOnceMethod;
}
- (id) init
{
...
ranExactlyOnceMethod = NO;
...
}
- (void) runExactlyOnceMethod
{
@synchronized(self) // lock
{
if (!ranExactlyOnceMethod) // not run yet?
{
// do stuff once
ranExactlyOnceMethod = YES;
}
}
}
关于objective-c - 对每个对象而不对每个类使用dispatch_once_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19832150/
这个问题在这里已经有了答案: Using a dispatch_once singleton model in Swift (30 个答案) 关闭 5 年前。 已经尝试过这些: 'dispatch_
我只想在每个实例中运行一次代码块。 我可以将 dispatch_once_t 谓词声明为成员变量而不是静态变量吗? 来自 GCD Reference ,我不清楚。 The predicate must
这个问题在这里已经有了答案: Whither dispatch_once in Swift 3? (7 个答案) Using a dispatch_once singleton model in S
我是一名优秀的程序员,十分优秀!