有多个来源调用特定方法,但我想确保它只被调用一次(每个对象)
我想使用类似的语法
// 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
}