From 575d6311236c1659f343b7bda2929407cdabf818 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 14 Jun 2017 12:27:23 -0400 Subject: [PATCH] Reduce number of database views. // FREEBIE. --- Podfile | 4 +-- Podfile.lock | 9 ++---- Signal/src/util/ThreadUtil.m | 55 +++++++++++++++--------------------- 3 files changed, 27 insertions(+), 41 deletions(-) diff --git a/Podfile b/Podfile index 64c1915dc..a33208ad2 100644 --- a/Podfile +++ b/Podfile @@ -5,8 +5,8 @@ target 'Signal' do pod 'SocketRocket', :git => 'https://github.com/facebook/SocketRocket.git' pod 'AxolotlKit', git: 'https://github.com/WhisperSystems/SignalProtocolKit.git' #pod 'AxolotlKit', path: '../SignalProtocolKit' - pod 'SignalServiceKit', git: 'https://github.com/WhisperSystems/SignalServiceKit.git' - #pod 'SignalServiceKit', path: '../SignalServiceKit' + #pod 'SignalServiceKit', git: 'https://github.com/WhisperSystems/SignalServiceKit.git' + pod 'SignalServiceKit', path: '../SignalServiceKit' pod 'JSQMessagesViewController', git: 'https://github.com/WhisperSystems/JSQMessagesViewController.git', branch: 'mkirk/position-edit-menu' #pod 'JSQMessagesViewController' path: '../JSQMessagesViewController' pod 'PureLayout' diff --git a/Podfile.lock b/Podfile.lock index 1a89df13e..a26c97191 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -112,7 +112,7 @@ DEPENDENCIES: - JSQMessagesViewController (from `https://github.com/WhisperSystems/JSQMessagesViewController.git`, branch `mkirk/position-edit-menu`) - PureLayout - Reachability - - SignalServiceKit (from `https://github.com/WhisperSystems/SignalServiceKit.git`) + - SignalServiceKit (from `../SignalServiceKit`) - SocketRocket (from `https://github.com/facebook/SocketRocket.git`) EXTERNAL SOURCES: @@ -122,7 +122,7 @@ EXTERNAL SOURCES: :branch: mkirk/position-edit-menu :git: https://github.com/WhisperSystems/JSQMessagesViewController.git SignalServiceKit: - :git: https://github.com/WhisperSystems/SignalServiceKit.git + :path: ../SignalServiceKit SocketRocket: :git: https://github.com/facebook/SocketRocket.git @@ -133,9 +133,6 @@ CHECKOUT OPTIONS: JSQMessagesViewController: :commit: 7054e4b13ee5bcd6d524adb6dc9a726e8c466308 :git: https://github.com/WhisperSystems/JSQMessagesViewController.git - SignalServiceKit: - :commit: d8199a444f643d142824d6e7b7c507a1b2c8032d - :git: https://github.com/WhisperSystems/SignalServiceKit.git SocketRocket: :commit: 877ac7438be3ad0b45ef5ca3969574e4b97112bf :git: https://github.com/facebook/SocketRocket.git @@ -161,6 +158,6 @@ SPEC CHECKSUMS: UnionFind: c33be5adb12983981d6e827ea94fc7f9e370f52d YapDatabase: cd911121580ff16675f65ad742a9eb0ab4d9e266 -PODFILE CHECKSUM: 89fd7aee1e2b0ca592ecc9dba0389e57b70f959b +PODFILE CHECKSUM: 6e5d90a9603eb043b395213fd8a29037d2276a8f COCOAPODS: 1.2.1 diff --git a/Signal/src/util/ThreadUtil.m b/Signal/src/util/ThreadUtil.m index cf2fa1f52..8ac4b6d21 100644 --- a/Signal/src/util/ThreadUtil.m +++ b/Signal/src/util/ThreadUtil.m @@ -113,12 +113,14 @@ NS_ASSUME_NONNULL_BEGIN [storageManager.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { const int kMaxBlockOfferOutgoingMessageCount = 10; - // Find any existing "dynamic" interactions. + // Find any "dynamic" interactions and safety number changes. __block OWSAddToContactsOfferMessage *existingAddToContactsOffer = nil; __block OWSUnknownContactBlockOfferMessage *existingBlockOffer = nil; __block TSUnreadIndicatorInteraction *existingUnreadIndicator = nil; + NSMutableArray *blockingSafetyNumberChanges = [NSMutableArray new]; + NSMutableArray *nonBlockingSafetyNumberChanges = [NSMutableArray new]; // We use different views for performance reasons. - [[transaction ext:TSDynamicMessagesDatabaseViewExtensionName] + [[transaction ext:TSThreadSpecialMessagesDatabaseViewExtensionName] enumerateRowsInGroup:thread.uniqueId usingBlock:^( NSString *collection, NSString *key, id object, id metadata, NSUInteger index, BOOL *stop) { @@ -132,30 +134,14 @@ NS_ASSUME_NONNULL_BEGIN } else if ([object isKindOfClass:[TSUnreadIndicatorInteraction class]]) { OWSAssert(!existingUnreadIndicator); existingUnreadIndicator = (TSUnreadIndicatorInteraction *)object; - } else { - DDLogError(@"Unexpected dynamic interaction type: %@", [object class]); - OWSAssert(0); - } - }]; - - // Find any existing safety number changes. - // - // We use different views for performance reasons. - NSMutableArray *blockingSafetyNumberChanges = [NSMutableArray new]; - NSMutableArray *nonBlockingSafetyNumberChanges = [NSMutableArray new]; - [[transaction ext:TSSafetyNumberChangeDatabaseViewExtensionName] - enumerateRowsInGroup:thread.uniqueId - usingBlock:^( - NSString *collection, NSString *key, id object, id metadata, NSUInteger index, BOOL *stop) { - - if ([object isKindOfClass:[TSInvalidIdentityKeyErrorMessage class]]) { + } else if ([object isKindOfClass:[TSInvalidIdentityKeyErrorMessage class]]) { [blockingSafetyNumberChanges addObject:object]; } else if ([object isKindOfClass:[TSErrorMessage class]]) { TSErrorMessage *errorMessage = (TSErrorMessage *)object; OWSAssert(errorMessage.errorType == TSErrorMessageNonBlockingIdentityChange); [nonBlockingSafetyNumberChanges addObject:errorMessage]; } else { - DDLogError(@"Unexpected interaction type: %@", [object class]); + DDLogError(@"Unexpected dynamic interaction type: %@", [object class]); OWSAssert(0); } }]; @@ -177,10 +163,21 @@ NS_ASSUME_NONNULL_BEGIN } } - TSIncomingMessage *firstIncomingMessage = - [[transaction ext:TSThreadIncomingMessageDatabaseViewExtensionName] firstObjectInGroup:thread.uniqueId]; - TSOutgoingMessage *firstOutgoingMessage = - [[transaction ext:TSThreadOutgoingMessageDatabaseViewExtensionName] firstObjectInGroup:thread.uniqueId]; + __block TSMessage *firstMessage = nil; + [[transaction ext:TSMessageDatabaseViewExtensionName] + enumerateRowsInGroup:thread.uniqueId + usingBlock:^( + NSString *collection, NSString *key, id object, id metadata, NSUInteger index, BOOL *stop) { + + OWSAssert([object isKindOfClass:[TSInteraction class]]); + + if ([object isKindOfClass:[TSIncomingMessage class]] || + [object isKindOfClass:[TSOutgoingMessage class]]) { + firstMessage = (TSMessage *)object; + *stop = YES; + } + }]; + NSUInteger outgoingMessageCount = [[transaction ext:TSThreadOutgoingMessageDatabaseViewExtensionName] numberOfItemsInGroup:thread.uniqueId]; NSUInteger threadMessageCount = @@ -270,12 +267,6 @@ NS_ASSUME_NONNULL_BEGIN } OWSAssert((result.firstUnseenInteractionTimestamp != nil) == (result.unreadIndicatorPosition != nil)); - TSMessage *firstMessage = firstIncomingMessage; - if (!firstMessage - || (firstOutgoingMessage && [firstOutgoingMessage compareForSorting:firstMessage] == NSOrderedAscending)) { - firstMessage = firstOutgoingMessage; - } - BOOL shouldHaveBlockOffer = YES; BOOL shouldHaveAddToContactsOffer = YES; @@ -314,9 +305,7 @@ NS_ASSUME_NONNULL_BEGIN shouldHaveBlockOffer = NO; } - BOOL hasOutgoingBeforeIncomingInteraction = (firstOutgoingMessage - && (!firstIncomingMessage || - [firstOutgoingMessage compareForSorting:firstIncomingMessage] == NSOrderedAscending)); + BOOL hasOutgoingBeforeIncomingInteraction = [firstMessage isKindOfClass:[TSOutgoingMessage class]]; if (hasOutgoingBeforeIncomingInteraction) { // If there is an outgoing message before an incoming message // the local user initiated this conversation, don't show a block offer.