// // MBIMUpdateQueue.m // kordophoned // // Created by James Magahern on 11/16/18. // Copyright © 2018 James Magahern. All rights reserved. // #import "MBIMUpdateQueue.h" #import "IMMessageItem+Encoded.h" #import "IMChat+Encoded.h" @interface MBIMUpdateItem (/*INTERNAL*/) @property (nonatomic, assign) NSUInteger messageSequenceNumber; @end @implementation MBIMUpdateQueue { NSUInteger _messageSequenceNumber; dispatch_queue_t _accessQueue; NSMutableArray *_consumers; } + (instancetype)sharedInstance { static MBIMUpdateQueue *sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[self alloc] init]; }); return sharedInstance; } - (instancetype)init { self = [super init]; if (self) { _accessQueue = dispatch_queue_create("net.buzzert.MBIMUpdateQueue", DISPATCH_QUEUE_SERIAL); _consumers = [[NSMutableArray alloc] init]; _messageSequenceNumber = 0; } return self; } - (void)addConsumer:(MBIMUpdateConsumer)consumer { __weak NSMutableArray *consumers = _consumers; dispatch_async(_accessQueue, ^{ [consumers addObject:consumer]; }); } - (void)removeConsumer:(MBIMUpdateConsumer)consumer { __weak NSMutableArray *consumers = _consumers; dispatch_async(_accessQueue, ^{ [consumers removeObject:consumer]; }); } - (void)enqueueUpdateItem:(MBIMUpdateItem *)item { _messageSequenceNumber++; item.messageSequenceNumber = _messageSequenceNumber; __weak NSMutableArray *consumers = _consumers; dispatch_async(_accessQueue, ^{ for (MBIMUpdateConsumer consumer in consumers) { consumer(item); } [consumers removeAllObjects]; }); } @end @implementation MBIMUpdateItem - (NSDictionary *)dictionaryRepresentation { NSMutableDictionary *updateDict = [NSMutableDictionary dictionary]; updateDict[@"messageSequenceNumber"] = @(_messageSequenceNumber); if ([self changedChat]) { updateDict[@"conversation"] = [[self changedChat] mbim_dictionaryRepresentation]; } if ([self addedMessage]) { updateDict[@"message"] = [[self addedMessage] mbim_dictionaryRepresentation]; } return updateDict; } @end