CKKSProvideKeySetOperation.m   [plain text]

#if OCTAGON

#import "CKKSProvideKeySetOperation.h"

@interface CKKSProvideKeySetOperation ()
@property (nullable) CKKSCurrentKeySet* keyset;
@property dispatch_queue_t queue;

@property (nullable) NSOperation* startDependency;
@end

@implementation CKKSProvideKeySetOperation
@synthesize zoneName = _zoneName;
@synthesize keyset = _keyset;

- (instancetype)initWithZoneName:(NSString*)zoneName
{
if((self = [super init])) {
_zoneName = zoneName;
_keyset = nil;
_startDependency = [NSBlockOperation blockOperationWithBlock:^{}];
_startDependency.name = @"key-set-provided";

_queue = dispatch_queue_create("key-set-queue", DISPATCH_QUEUE_SERIAL);

[self addDependency:_startDependency];
}
return self;
}

- (void)provideKeySet:(CKKSCurrentKeySet *)keyset
{
// Ensure that only one keyset is provided through each operation
dispatch_sync(self.queue, ^{
if(!self.keyset) {
self.keyset = keyset;
if(self.startDependency) {
// Create a new queue here, just to be safe in case someone is waiting
NSOperationQueue* queue = [[NSOperationQueue alloc] init];
[queue addOperation:self.startDependency];
self.startDependency = nil;
}
}
});

}
@end

#endif // OCTAGON