From ddf4bf28ccf222219a28a7b0fed95061af904194 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 16 Nov 2017 11:22:16 -0500 Subject: [PATCH] Load attachments for conversation view items using long-lived db connection. --- .../ConversationViewController.m | 6 ++- .../ConversationView/ConversationViewItem.h | 9 +++-- .../ConversationView/ConversationViewItem.m | 40 ++++++++++--------- .../ConversationViewItemTest.m | 7 +++- 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 55b86352c..94fced09f 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -4007,7 +4007,9 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { if (viewItem) { viewItem.previousRow = viewItem.row; } else { - viewItem = [[ConversationViewItem alloc] initWithTSInteraction:interaction isGroupThread:isGroupThread]; + viewItem = [[ConversationViewItem alloc] initWithInteraction:interaction + isGroupThread:isGroupThread + transaction:transaction]; } viewItem.row = (NSInteger)row; [viewItems addObject:viewItem]; @@ -4125,7 +4127,7 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { if (!interaction) { OWSFail(@"%@ could not reload interaction", self.logTag); } else { - [viewItem replaceInteraction:interaction]; + [viewItem replaceInteraction:interaction transaction:transaction]; } }]; } diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h index 3423b51c7..ae315ef61 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h @@ -30,6 +30,7 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType); @class TSAttachmentPointer; @class TSAttachmentStream; @class TSInteraction; +@class YapDatabaseReadTransaction; // This is a ViewModel for cells in the conversation view. // @@ -55,15 +56,15 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType); // previous update. @property (nonatomic) NSInteger previousRow; -//@property (nonatomic, weak) ConversationViewCell *lastCell; - - (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithTSInteraction:(TSInteraction *)interaction isGroupThread:(BOOL)isGroupThread; +- (instancetype)initWithInteraction:(TSInteraction *)interaction + isGroupThread:(BOOL)isGroupThread + transaction:(YapDatabaseReadTransaction *)transaction; - (ConversationViewCell *)dequeueCellForCollectionView:(UICollectionView *)collectionView indexPath:(NSIndexPath *)indexPath; -- (void)replaceInteraction:(TSInteraction *)interaction; +- (void)replaceInteraction:(TSInteraction *)interaction transaction:(YapDatabaseReadTransaction *)transaction; - (void)clearCachedLayoutState; diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m index c7f9ad396..f9ddeebc5 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m @@ -63,7 +63,9 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) @implementation ConversationViewItem -- (instancetype)initWithTSInteraction:(TSInteraction *)interaction isGroupThread:(BOOL)isGroupThread +- (instancetype)initWithInteraction:(TSInteraction *)interaction + isGroupThread:(BOOL)isGroupThread + transaction:(YapDatabaseReadTransaction *)transaction { self = [super init]; @@ -76,10 +78,12 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) self.row = NSNotFound; self.previousRow = NSNotFound; + [self ensureViewState:transaction]; + return self; } -- (void)replaceInteraction:(TSInteraction *)interaction +- (void)replaceInteraction:(TSInteraction *)interaction transaction:(YapDatabaseReadTransaction *)transaction { OWSAssert(interaction); @@ -93,6 +97,8 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) self.contentSize = CGSizeZero; [self clearCachedLayoutState]; + + [self ensureViewState:transaction]; } - (void)setShouldShowDate:(BOOL)shouldShowDate @@ -332,7 +338,10 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) } - (nullable TSAttachment *)firstAttachmentIfAnyOfMessage:(TSMessage *)message + transaction:(YapDatabaseReadTransaction *)transaction { + OWSAssert(transaction); + if (message.attachmentIds.count == 0) { return nil; } @@ -340,21 +349,22 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) if (attachmentId.length == 0) { return nil; } - return [TSAttachment fetchObjectWithUniqueID:attachmentId]; + return [TSAttachment fetchObjectWithUniqueID:attachmentId transaction:transaction]; } -- (void)ensureViewState +- (void)ensureViewState:(YapDatabaseReadTransaction *)transaction { + OWSAssert([NSThread isMainThread]); + OWSAssert(transaction); + OWSAssert(!self.hasViewState); + OWSAssert([self.interaction isKindOfClass:[TSOutgoingMessage class]] || [self.interaction isKindOfClass:[TSIncomingMessage class]]); - if (self.hasViewState) { - return; - } self.hasViewState = YES; TSMessage *message = (TSMessage *)self.interaction; - TSAttachment *_Nullable attachment = [self firstAttachmentIfAnyOfMessage:message]; + TSAttachment *_Nullable attachment = [self firstAttachmentIfAnyOfMessage:message transaction:transaction]; if (attachment) { if ([attachment isKindOfClass:[TSAttachmentStream class]]) { self.attachmentStream = (TSAttachmentStream *)attachment; @@ -418,16 +428,13 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) { OWSAssert([NSThread isMainThread]); - [self ensureViewState]; - return _messageCellType; } - (nullable DisplayableText *)displayableText { OWSAssert([NSThread isMainThread]); - - [self ensureViewState]; + OWSAssert(self.hasViewState); OWSAssert(_displayableText); OWSAssert(_displayableText.displayText); @@ -439,8 +446,7 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) - (nullable TSAttachmentStream *)attachmentStream { OWSAssert([NSThread isMainThread]); - - [self ensureViewState]; + OWSAssert(self.hasViewState); return _attachmentStream; } @@ -448,8 +454,7 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) - (nullable TSAttachmentPointer *)attachmentPointer { OWSAssert([NSThread isMainThread]); - - [self ensureViewState]; + OWSAssert(self.hasViewState); return _attachmentPointer; } @@ -457,8 +462,7 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) - (CGSize)contentSize { OWSAssert([NSThread isMainThread]); - - [self ensureViewState]; + OWSAssert(self.hasViewState); return _contentSize; } diff --git a/Signal/test/ViewControllers/ConversationViewItemTest.m b/Signal/test/ViewControllers/ConversationViewItemTest.m index cf275ffa4..3914015e8 100644 --- a/Signal/test/ViewControllers/ConversationViewItemTest.m +++ b/Signal/test/ViewControllers/ConversationViewItemTest.m @@ -48,7 +48,10 @@ TSOutgoingMessage *message = [[TSOutgoingMessage alloc] initWithTimestamp:1 inThread:nil messageBody:self.fakeTextMessageText]; [message save]; - ConversationViewItem *viewItem = [[ConversationViewItem alloc] initWithTSInteraction:message isGroupThread:NO]; + __block ConversationViewItem *viewItem = nil; + [TSYapDatabaseObject.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + viewItem = [[ConversationViewItem alloc] initWithInteraction:message isGroupThread:NO transaction:transaction]; + }]; return viewItem; } @@ -72,7 +75,7 @@ TSOutgoingMessage *message = [[TSOutgoingMessage alloc] initWithTimestamp:1 inThread:nil messageBody:nil attachmentIds:attachmentIds]; [message save]; - ConversationViewItem *viewItem = [[ConversationViewItem alloc] initWithTSInteraction:message isGroupThread:NO]; + ConversationViewItem *viewItem = [[ConversationViewItem alloc] initWithInteraction:message isGroupThread:NO]; return viewItem; }