我需要在一种-invalidate
方法中保护一些代码以使串行队列无效,以便这些代码运行一次,就像dispatch_once
在单例范式中一样。
我的直觉是:
@property(nonatomic, readonly, getter=isValid) BOOL valid;
@property(nonatomic) dispatch_queue_t serialQueue;
...
- (void)invalidate {
if ([self isValid]){
dispatch_sync(self.serialQueue, ^{
if ([self isValid]) {
_valid = NO;
// relinquish resources here
}
});
if (self.serialQueue) {
dispatch_release (self.serialQueue);
}
}
}
此-invalidate
方法将被显式调用或由-dealloc
. 而且我想确保资源将被放弃一次且仅一次。
这个实现是线程安全的吗?
dispatch_once
以每个实例的方式实现块是更好的方法吗?
@property(nonatomic, readonly) dispatch_once_t invalidated;
...
- (void)invalidate {
dispatch_once(&_invalidated, ^{
dispatch_sync(logQueue, ^{
// double check
if (self.isValid) {
self.valid = NO;
// relinquish things
}
}
}
}