From af36e74d05a143fd464afb6acc626f8b8cb08245 Mon Sep 17 00:00:00 2001 From: Connor Pearson Date: Wed, 1 Apr 2015 10:34:17 -0400 Subject: [PATCH] CB-8780 - Display popover using main thread. Fixes popover slowness (closes #81) --- src/ios/CDVCamera.m | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/ios/CDVCamera.m b/src/ios/CDVCamera.m index 6eaa79d..6521c9e 100644 --- a/src/ios/CDVCamera.m +++ b/src/ios/CDVCamera.m @@ -130,8 +130,8 @@ static NSString* toBase64(NSData* data) { [self.commandDelegate runInBackground:^{ CDVPictureOptions* pictureOptions = [CDVPictureOptions createFromTakePictureArguments:command]; - pictureOptions.popoverSupported = [self popoverSupported]; - pictureOptions.usesGeolocation = [self usesGeolocation]; + pictureOptions.popoverSupported = [weakSelf popoverSupported]; + pictureOptions.usesGeolocation = [weakSelf usesGeolocation]; pictureOptions.cropToSize = NO; BOOL hasCamera = [UIImagePickerController isSourceTypeAvailable:pictureOptions.sourceType]; @@ -142,13 +142,6 @@ static NSString* toBase64(NSData* data) { return; } - // If a popover is already open, close it; we only want one at a time. - if (([[weakSelf pickerController] pickerPopoverController] != nil) && [[[weakSelf pickerController] pickerPopoverController] isPopoverVisible]) { - [[[weakSelf pickerController] pickerPopoverController] dismissPopoverAnimated:YES]; - [[[weakSelf pickerController] pickerPopoverController] setDelegate:nil]; - [[weakSelf pickerController] setPickerPopoverController:nil]; - } - CDVCameraPicker* cameraPicker = [CDVCameraPicker createFromPictureOptions:pictureOptions]; weakSelf.pickerController = cameraPicker; @@ -157,20 +150,27 @@ static NSString* toBase64(NSData* data) { // we need to capture this state for memory warnings that dealloc this object cameraPicker.webView = weakSelf.webView; - if ([weakSelf popoverSupported] && (pictureOptions.sourceType != UIImagePickerControllerSourceTypeCamera)) { - if (cameraPicker.pickerPopoverController == nil) { - cameraPicker.pickerPopoverController = [[NSClassFromString(@"UIPopoverController") alloc] initWithContentViewController:cameraPicker]; + // Perform UI operations on the main thread + dispatch_async(dispatch_get_main_queue(), ^{ + // If a popover is already open, close it; we only want one at a time. + if (([[weakSelf pickerController] pickerPopoverController] != nil) && [[[weakSelf pickerController] pickerPopoverController] isPopoverVisible]) { + [[[weakSelf pickerController] pickerPopoverController] dismissPopoverAnimated:YES]; + [[[weakSelf pickerController] pickerPopoverController] setDelegate:nil]; + [[weakSelf pickerController] setPickerPopoverController:nil]; } - [weakSelf displayPopover:pictureOptions.popoverOptions]; - weakSelf.hasPendingOperation = NO; - } else { - dispatch_async(dispatch_get_main_queue(), ^{ + if ([weakSelf popoverSupported] && (pictureOptions.sourceType != UIImagePickerControllerSourceTypeCamera)) { + if (cameraPicker.pickerPopoverController == nil) { + cameraPicker.pickerPopoverController = [[NSClassFromString(@"UIPopoverController") alloc] initWithContentViewController:cameraPicker]; + } + [weakSelf displayPopover:pictureOptions.popoverOptions]; + weakSelf.hasPendingOperation = NO; + } else { [weakSelf.viewController presentViewController:cameraPicker animated:YES completion:^{ weakSelf.hasPendingOperation = NO; }]; - }); - } + } + }); }]; }