Respond to CR.

This commit is contained in:
Matthew Chen 2018-02-14 16:06:47 -05:00
parent 8930110efd
commit b7958262ba
5 changed files with 25 additions and 96 deletions

View File

@ -265,35 +265,14 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo
_finder = finder;
_isDrainingQueue = NO;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appIsReady)
name:AppIsReadyNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(yapDatabaseModified:)
name:YapDatabaseModifiedNotification
object:TSStorageManager.sharedManager.dbNotificationObject];
// Start processing.
[AppReadiness runNowOrWhenAppIsReady:^{
[self drainQueue];
}];
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)appIsReady
{
[self drainQueue];
}
- (void)yapDatabaseModified:(NSNotification *)notification
{
OWSAssertIsOnMainThread();
[self drainQueue];
}
#pragma mark - instance methods
- (dispatch_queue_t)serialQueue
@ -319,24 +298,14 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo
- (void)drainQueue
{
OWSAssert(AppReadiness.isAppReady);
// Don't process incoming messages in app extensions.
if (!CurrentAppContext().isMainApp) {
return;
}
dispatch_async(self.serialQueue, ^{
if (!AppReadiness.isAppReady) {
// We don't want to process incoming messages until storage is ready.
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[AppReadiness runNowOrWhenAppIsReady:^{
[self drainQueue];
}];
});
return;
}
if (self.isDrainingQueue) {
return;
}
@ -489,8 +458,13 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo
// We need to persist the decrypted envelope data ASAP to prevent data loss.
[self.processingQueue enqueueEnvelopeData:envelopeData plaintextData:plaintextData transaction:transaction];
// The new envelope won't be visible to the finder until this transaction commits,
// so don't bother calling drainQueue here.
// so drainQueue in the transaction completion.
[transaction addCompletionQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
completionBlock:^{
[self.processingQueue drainQueue];
}];
}
@end

View File

@ -243,24 +243,13 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin
_finder = finder;
_isDrainingQueue = NO;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appIsReady)
name:AppIsReadyNotification
object:nil];
[AppReadiness runNowOrWhenAppIsReady:^{
[self drainQueue];
}];
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)appIsReady
{
[self drainQueue];
}
#pragma mark - instance methods
- (dispatch_queue_t)serialQueue
@ -280,23 +269,14 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin
- (void)drainQueue
{
OWSAssert(AppReadiness.isAppReady);
// Don't decrypt messages in app extensions.
if (!CurrentAppContext().isMainApp) {
return;
}
dispatch_async(self.serialQueue, ^{
if (!AppReadiness.isAppReady) {
// We don't want to process incoming messages until storage is ready.
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[AppReadiness runNowOrWhenAppIsReady:^{
[self drainQueue];
}];
});
return;
}
if (self.isDrainingQueue) {
return;
}

View File

@ -177,13 +177,10 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE
OWSSingletonAssert();
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appIsReady)
name:AppIsReadyNotification
object:nil];
// Try to start processing.
[self scheduleProcessing];
// Start processing.
[AppReadiness runNowOrWhenAppIsReady:^{
[self scheduleProcessing];
}];
return self;
}
@ -193,27 +190,14 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)appIsReady
{
[self scheduleProcessing];
}
// Schedules a processing pass, unless one is already scheduled.
- (void)scheduleProcessing
{
OWSAssert(AppReadiness.isAppReady);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
@synchronized(self)
{
if (!AppReadiness.isAppReady) {
DDLogInfo(@"%@ Deferring read receipt processing; storage not yet ready.", self.logTag);
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[AppReadiness runNowOrWhenAppIsReady:^{
[self scheduleProcessing];
}];
});
return;
}
if (self.isProcessing) {
return;
}

View File

@ -4,8 +4,6 @@
NS_ASSUME_NONNULL_BEGIN
extern NSString *const AppIsReadyNotification;
typedef void (^AppReadyBlock)(void);
@interface AppReadiness : NSObject

View File

@ -3,12 +3,9 @@
//
#import "AppReadiness.h"
#import "NSNotificationCenter+OWS.h"
NS_ASSUME_NONNULL_BEGIN
NSString *const AppIsReadyNotification = @"AppIsReadyNotification";
@interface AppReadiness ()
@property (atomic) BOOL isAppReady;
@ -85,8 +82,6 @@ NSString *const AppIsReadyNotification = @"AppIsReadyNotification";
self.isAppReady = YES;
[self runAppReadyBlocks];
[[NSNotificationCenter defaultCenter] postNotificationNameAsync:AppIsReadyNotification object:nil userInfo:nil];
}
- (void)runAppReadyBlocks
@ -94,12 +89,10 @@ NSString *const AppIsReadyNotification = @"AppIsReadyNotification";
OWSAssertIsOnMainThread();
OWSAssert(self.isAppReady);
// Make a local copy, then clear this state.
NSArray<AppReadyBlock> *appReadyBlocks = self.appReadyBlocks;
self.appReadyBlocks = nil;
for (AppReadyBlock block in appReadyBlocks) {
for (AppReadyBlock block in self.appReadyBlocks) {
block();
}
self.appReadyBlocks = nil;
}
@end