From ada4880dc3e0a62a79977fc3e466fa5e19f21be6 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 23 May 2017 10:12:09 -0400 Subject: [PATCH] Add a database view for dynamic interactions. // FREEBIE --- Signal/src/util/ThreadUtil.m | 47 ++++++++++++++----- .../src/views/TSUnreadIndicatorInteraction.m | 5 ++ 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/Signal/src/util/ThreadUtil.m b/Signal/src/util/ThreadUtil.m index b1af6cda6..e54058316 100644 --- a/Signal/src/util/ThreadUtil.m +++ b/Signal/src/util/ThreadUtil.m @@ -106,7 +106,8 @@ NS_ASSUME_NONNULL_BEGIN __block TSIncomingMessage *firstUnreadMessage = nil; __block long outgoingMessageCount = 0; - [[transaction ext:TSMessageDatabaseViewExtensionName] + // We use different views for performance reasons. + [[transaction ext:TSDynamicMessagesDatabaseViewExtensionName] enumerateRowsInGroup:thread.uniqueId usingBlock:^( NSString *collection, NSString *key, id object, id metadata, NSUInteger index, BOOL *stop) { @@ -120,7 +121,36 @@ NS_ASSUME_NONNULL_BEGIN } else if ([object isKindOfClass:[TSUnreadIndicatorInteraction class]]) { OWSAssert(!existingUnreadIndicator); existingUnreadIndicator = (TSUnreadIndicatorInteraction *)object; - } else if ([object isKindOfClass:[TSIncomingMessage class]]) { + } else { + DDLogError(@"Unexpected dynamic interaction type: %@", [object class]); + OWSAssert(0); + } + }]; + [[transaction ext:TSUnreadDatabaseViewExtensionName] + enumerateRowsInGroup:thread.uniqueId + usingBlock:^( + NSString *collection, NSString *key, id object, id metadata, NSUInteger index, BOOL *stop) { + + if (![object isKindOfClass:[TSIncomingMessage class]]) { + DDLogError(@"Unexpected unread message type: %@", [object class]); + OWSAssert(0); + return; + } + TSIncomingMessage *incomingMessage = (TSIncomingMessage *)object; + if (incomingMessage.wasRead) { + DDLogError(@"Unexpectedly read unread message"); + OWSAssert(0); + return; + } + firstUnreadMessage = incomingMessage; + *stop = YES; + }]; + [[transaction ext:TSMessageDatabaseViewExtensionName] + enumerateRowsInGroup:thread.uniqueId + usingBlock:^( + NSString *collection, NSString *key, id object, id metadata, NSUInteger index, BOOL *stop) { + + if ([object isKindOfClass:[TSIncomingMessage class]]) { TSIncomingMessage *incomingMessage = (TSIncomingMessage *)object; if (!firstIncomingMessage) { firstIncomingMessage = incomingMessage; @@ -129,16 +159,6 @@ NS_ASSUME_NONNULL_BEGIN compare:[incomingMessage receiptDateForSorting]] == NSOrderedAscending); } - - if (!incomingMessage.wasRead) { - if (!firstUnreadMessage) { - firstUnreadMessage = incomingMessage; - } else { - OWSAssert([[firstUnreadMessage receiptDateForSorting] - compare:[incomingMessage receiptDateForSorting]] - == NSOrderedAscending); - } - } } else if ([object isKindOfClass:[TSOutgoingMessage class]]) { TSOutgoingMessage *outgoingMessage = (TSOutgoingMessage *)object; if (!firstOutgoingMessage) { @@ -149,6 +169,9 @@ NS_ASSUME_NONNULL_BEGIN == NSOrderedAscending); } outgoingMessageCount++; + if (outgoingMessageCount >= kMaxBlockOfferOutgoingMessageCount) { + *stop = YES; + } } }]; diff --git a/Signal/src/views/TSUnreadIndicatorInteraction.m b/Signal/src/views/TSUnreadIndicatorInteraction.m index ad099a7cd..a86c69955 100644 --- a/Signal/src/views/TSUnreadIndicatorInteraction.m +++ b/Signal/src/views/TSUnreadIndicatorInteraction.m @@ -39,6 +39,11 @@ NS_ASSUME_NONNULL_BEGIN return self.date; } +- (BOOL)isDynamicInteraction +{ + return YES; +} + @end NS_ASSUME_NONNULL_END