Использование dispatch_once_t для объекта, а не для класса
Существует несколько источников, вызывающих определенный метод, но я хотел бы убедиться, что он вызывается ровно один раз (для каждого объекта)
Я хотел бы использовать синтаксис, как
// 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 для объекта - если нет, то каков наилучший способ гарантировать, что он вызывается один раз?
РЕДАКТИРОВАТЬ:
Вот предлагаемое решение, о котором я думаю - кажется ли это хорошо?
@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
}