From a1a66bf4011d41d5df2a4f582a9aa668dfeaceef Mon Sep 17 00:00:00 2001 From: emawby Date: Wed, 24 Apr 2024 14:40:04 -0700 Subject: [PATCH 1/2] Synchronize queue reads and writes on self.queue Additionally verify that queue.count > 0 prior to removing object at index 0 --- .../Source/OneSignalDialogController.m | 52 +++++++++++-------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/iOS_SDK/OneSignalSDK/Source/OneSignalDialogController.m b/iOS_SDK/OneSignalSDK/Source/OneSignalDialogController.m index 3377549f0..7e0f766c2 100644 --- a/iOS_SDK/OneSignalSDK/Source/OneSignalDialogController.m +++ b/iOS_SDK/OneSignalSDK/Source/OneSignalDialogController.m @@ -60,15 +60,16 @@ - (void)presentDialogWithTitle:(NSString * _Nonnull)title withMessage:(NSString //ensure this UI code executes on the main thread dispatch_async(dispatch_get_main_queue(), ^{ let request = [[OSDialogRequest alloc] initWithTitle:title withMessage:message withActionTitles:actionTitles withCancelTitle:cancelTitle withCompletion:completion]; - - [self.queue addObject:request]; - - //check if already presenting a different dialog - //if so, we shouldn't present on top of existing dialog - if (self.queue.count > 1) - return; - - [self displayDialog:request]; + @synchronized (self.queue) { + [self.queue addObject:request]; + + //check if already presenting a different dialog + //if so, we shouldn't present on top of existing dialog + if (self.queue.count > 1) + return; + + [self displayDialog:request]; + } }); } @@ -101,23 +102,28 @@ - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)butto - (void)delayResult:(int)result { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - let currentDialog = self.queue.firstObject; - - if (currentDialog.completion) - currentDialog.completion(result); - - [self.queue removeObjectAtIndex:0]; - - //check if no more dialogs left to display in queue - if (self.queue.count == 0) - return; - - let nextDialog = self.queue.firstObject; - - [self displayDialog:nextDialog]; + @synchronized (self.queue) { + if (self.queue.count > 0) { + let currentDialog = self.queue.firstObject; + + if (currentDialog.completion) + currentDialog.completion(result); + + [self.queue removeObjectAtIndex:0]; + } + + //check if no more dialogs left to display in queue + if (self.queue.count == 0) + return; + + let nextDialog = self.queue.firstObject; + + [self displayDialog:nextDialog]; + } }); } +// Unused. Currently only referenced in player model unit tests - (void)clearQueue { self.queue = [NSMutableArray new]; } From 790b776e2854786f3320e6da1dd276743a47776b Mon Sep 17 00:00:00 2001 From: emawby Date: Mon, 29 Apr 2024 09:42:17 -0700 Subject: [PATCH 2/2] move displayDialog outside of synchronized blocks --- iOS_SDK/OneSignalSDK/Source/OneSignalDialogController.m | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/iOS_SDK/OneSignalSDK/Source/OneSignalDialogController.m b/iOS_SDK/OneSignalSDK/Source/OneSignalDialogController.m index 7e0f766c2..2838c640d 100644 --- a/iOS_SDK/OneSignalSDK/Source/OneSignalDialogController.m +++ b/iOS_SDK/OneSignalSDK/Source/OneSignalDialogController.m @@ -67,9 +67,8 @@ - (void)presentDialogWithTitle:(NSString * _Nonnull)title withMessage:(NSString //if so, we shouldn't present on top of existing dialog if (self.queue.count > 1) return; - - [self displayDialog:request]; } + [self displayDialog:request]; }); } @@ -102,6 +101,7 @@ - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)butto - (void)delayResult:(int)result { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + OSDialogRequest *nextDialog = nil; @synchronized (self.queue) { if (self.queue.count > 0) { let currentDialog = self.queue.firstObject; @@ -116,8 +116,9 @@ - (void)delayResult:(int)result { if (self.queue.count == 0) return; - let nextDialog = self.queue.firstObject; - + nextDialog = self.queue.firstObject; + } + if (nextDialog != nil) { [self displayDialog:nextDialog]; } });