diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewModel.m b/Signal/src/ViewControllers/ConversationView/ConversationViewModel.m index b5f0ddf20..0d476112c 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewModel.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewModel.m @@ -1166,23 +1166,23 @@ static const int kYapDatabaseRangeMinLength = 0; [self ensureConversationProfileState]; __block BOOL hasError = NO; - [self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { - id (^tryToAddViewItem)(TSInteraction *) = ^(TSInteraction *interaction) { - OWSAssertDebug(interaction.uniqueId.length > 0); - - id _Nullable viewItem = self.viewItemCache[interaction.uniqueId]; - if (!viewItem) { - viewItem = [[ConversationInteractionViewItem alloc] initWithInteraction:interaction - isGroupThread:isGroupThread - transaction:transaction - conversationStyle:conversationStyle]; - } - [viewItems addObject:viewItem]; - OWSAssertDebug(!viewItemCache[interaction.uniqueId]); - viewItemCache[interaction.uniqueId] = viewItem; - return viewItem; - }; + id (^tryToAddViewItem)(TSInteraction *, YapDatabaseReadTransaction *) = ^(TSInteraction *interaction, YapDatabaseReadTransaction *transaction) { + OWSAssertDebug(interaction.uniqueId.length > 0); + + id _Nullable viewItem = self.viewItemCache[interaction.uniqueId]; + if (!viewItem) { + viewItem = [[ConversationInteractionViewItem alloc] initWithInteraction:interaction + isGroupThread:isGroupThread + transaction:transaction + conversationStyle:conversationStyle]; + } + [viewItems addObject:viewItem]; + OWSAssertDebug(!viewItemCache[interaction.uniqueId]); + viewItemCache[interaction.uniqueId] = viewItem; + return viewItem; + }; + [self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { NSMutableArray *interactions = [NSMutableArray new]; NSMutableSet *interactionIds = [NSMutableSet new]; @@ -1217,7 +1217,7 @@ static const int kYapDatabaseRangeMinLength = 0; loadedInteractions:interactions canLoadMoreItems:canLoadMoreItems]; if (offers && [interactionIds containsObject:offers.beforeInteractionId]) { - id offersItem = tryToAddViewItem(offers); + id offersItem = tryToAddViewItem(offers, transaction); if ([offersItem.interaction isKindOfClass:[OWSContactOffersInteraction class]]) { OWSContactOffersInteraction *oldOffers = (OWSContactOffersInteraction *)offersItem.interaction; BOOL didChange = (oldOffers.hasBlockOffer != offers.hasBlockOffer @@ -1232,17 +1232,7 @@ static const int kYapDatabaseRangeMinLength = 0; } for (TSInteraction *interaction in interactions) { - tryToAddViewItem(interaction); - } - - if (self.typingIndicatorsSender) { - id _Nullable lastViewItem = viewItems.lastObject; - uint64_t typingIndicatorTimestamp = (lastViewItem ? lastViewItem.interaction.timestamp + 1 : 1); - TSInteraction *interaction = - [[OWSTypingIndicatorInteraction alloc] initWithThread:self.thread - timestamp:typingIndicatorTimestamp - recipientId:self.typingIndicatorsSender]; - tryToAddViewItem(interaction); + tryToAddViewItem(interaction, transaction); } }]; @@ -1252,6 +1242,18 @@ static const int kYapDatabaseRangeMinLength = 0; return [left.interaction compareForSorting:right.interaction]; }]; + if (self.typingIndicatorsSender) { + [self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + id _Nullable lastViewItem = viewItems.lastObject; + uint64_t typingIndicatorTimestamp = (lastViewItem ? lastViewItem.interaction.timestamp + 1 : 1); + TSInteraction *interaction = + [[OWSTypingIndicatorInteraction alloc] initWithThread:self.thread + timestamp:typingIndicatorTimestamp + recipientId:self.typingIndicatorsSender]; + tryToAddViewItem(interaction, transaction); + }]; + } + // Flag to ensure that we only increment once per launch. if (hasError) { OWSLogWarn(@"incrementing version of: %@", TSMessageDatabaseViewExtensionName);