gpt4 book ai didi

objective-c - 对每个对象而不对每个类使用dispatch_once_t

转载 作者:太空狗 更新时间:2023-10-30 03:26:17 28 4
gpt4 key购买 nike

有多个调用特定方法的资源,但我想确保(每个对象)仅被调用一次

我想使用类似的语法

// 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{...}

问题是 token 在同一个类的所有实例之间共享-所以不是一个很好的解决方案-每个对象是否有dispatch_once_t-如果不是,确保它被调用一次的最佳方法是什么?

编辑:

这是我正在考虑的建议解决方案-看起来还好吗?
@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;
}
}
}

对此有一个通用的优化,但是鉴于其他讨论,让我们跳过这一点。

这是“便宜”吗?可能不是,但是所有事情都是相对的,它的花费可能并不大-但是YMMV!

高温超导

关于objective-c - 对每个对象而不对每个类使用dispatch_once_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19832150/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com