diff --git a/Signal/src/view controllers/MessagesViewController.m b/Signal/src/view controllers/MessagesViewController.m index 9bfd086a9..7d998c9fd 100644 --- a/Signal/src/view controllers/MessagesViewController.m +++ b/Signal/src/view controllers/MessagesViewController.m @@ -91,6 +91,8 @@ typedef enum : NSUInteger { @property (nonatomic) BOOL composeOnOpen; @property (nonatomic) BOOL peek; +@property NSCache *messageAdapterCache; + @end @interface UINavigationItem () { @@ -150,6 +152,8 @@ typedef enum : NSUInteger { [super viewDidLoad]; [self.navigationController.navigationBar setTranslucent:NO]; + self.messageAdapterCache = [[NSCache alloc] init]; + _showFingerprintDisplay = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(showFingerprint)]; @@ -1590,6 +1594,8 @@ typedef enum : NSUInteger { for (YapDatabaseViewRowChange *rowChange in messageRowChanges) { switch (rowChange.type) { case YapDatabaseViewChangeDelete: { + TSInteraction *interaction = [self interactionAtIndexPath:rowChange.indexPath]; + [self.messageAdapterCache removeObjectForKey:interaction.uniqueId]; [self.collectionView deleteItemsAtIndexPaths:@[ rowChange.indexPath ]]; break; } @@ -1609,7 +1615,8 @@ typedef enum : NSUInteger { if (_lastDeliveredMessageIndexPath) { [rowsToUpdate addObject:_lastDeliveredMessageIndexPath]; } - + TSInteraction *interaction = [self interactionAtIndexPath:rowChange.indexPath]; + [self.messageAdapterCache removeObjectForKey:interaction.uniqueId]; [self.collectionView reloadItemsAtIndexPaths:rowsToUpdate]; scrollToBottom = YES; break; @@ -1661,7 +1668,15 @@ typedef enum : NSUInteger { - (TSMessageAdapter *)messageAtIndexPath:(NSIndexPath *)indexPath { TSInteraction *interaction = [self interactionAtIndexPath:indexPath]; - return [TSMessageAdapter messageViewDataWithInteraction:interaction inThread:self.thread]; + + TSMessageAdapter *messageAdapter = [self.messageAdapterCache objectForKey:interaction.uniqueId]; + + if (messageAdapter == nil) { + messageAdapter = [TSMessageAdapter messageViewDataWithInteraction:interaction inThread:self.thread]; + [self.messageAdapterCache setObject:messageAdapter forKey: interaction.uniqueId]; + } + + return messageAdapter; } #pragma mark group action view