Существует несколько источников, вызывающих определенный метод, но я хотел бы убедиться, что он вызывается ровно один раз (на объект)
Я хотел бы использовать синтаксис вроде
// 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{...}
Проблема заключается в том, что токен делится на все экземпляры одного и того же класса, поэтому не является хорошим решением - есть ли dispatch_once_t для объекта - если нет, то лучший способ гарантировать, что он вызывается один раз?
EDIT:
Вот предлагаемое решение, о котором я думаю, - похоже ли это хорошо?
@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
}