diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 788a68e65..26828fa18 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -108,6 +108,25 @@ typedef enum : NSUInteger { #pragma mark - +// We use snapshots to ensure that the view has a consistent +// representation of view model state which is not updated +// when the view is not observing view model changes. +@interface ConversationSnapshot : NSObject + +@property (nonatomic) NSArray> *viewItems; +@property (nonatomic) ThreadDynamicInteractions *dynamicInteractions; +@property (nonatomic) BOOL canLoadMoreItems; + +@end + +#pragma mark - + +@implementation ConversationSnapshot + +@end + +#pragma mark - + @interface ConversationViewController () > *)viewItems { - return self.conversationViewModel.viewItems; + return self.conversationSnapshot.viewItems; } - (ThreadDynamicInteractions *)dynamicInteractions { - return self.conversationViewModel.dynamicInteractions; + return self.conversationSnapshot.dynamicInteractions; } - (NSIndexPath *_Nullable)indexPathOfUnreadMessagesIndicator @@ -1697,7 +1719,7 @@ typedef enum : NSUInteger { { OWSAssertDebug(self.conversationViewModel); - self.showLoadMoreHeader = self.conversationViewModel.canLoadMoreItems; + self.showLoadMoreHeader = self.conversationSnapshot.canLoadMoreItems; } - (void)setShowLoadMoreHeader:(BOOL)showLoadMoreHeader @@ -4138,6 +4160,7 @@ typedef enum : NSUInteger { if (self.shouldObserveVMUpdates) { OWSLogVerbose(@"resume observation of view model."); + [self updateConversationSnapshot]; [self resetContentAndLayout]; [self updateBackButtonUnreadCount]; [self updateNavigationBarSubtitleLabel]; @@ -4612,6 +4635,7 @@ typedef enum : NSUInteger { return; } + [self updateConversationSnapshot]; [self updateBackButtonUnreadCount]; [self updateNavigationBarSubtitleLabel]; @@ -4909,6 +4933,17 @@ typedef enum : NSUInteger { [self.inputToolbar updateLayoutWithSafeAreaInsets:safeAreaInsets]; } +#pragma mark - Conversation Snapshot + +- (void)updateConversationSnapshot +{ + ConversationSnapshot *conversationSnapshot = [ConversationSnapshot new]; + conversationSnapshot.viewItems = self.conversationViewModel.viewItems; + conversationSnapshot.dynamicInteractions = self.conversationViewModel.dynamicInteractions; + conversationSnapshot.canLoadMoreItems = self.conversationViewModel.canLoadMoreItems; + _conversationSnapshot = conversationSnapshot; +} + @end NS_ASSUME_NONNULL_END