CB-8780 - Display popover using main thread. Fixes popover slowness (closes #81)

This commit is contained in:
Connor Pearson 2015-04-01 10:34:17 -04:00 committed by Shazron Abdullah
parent 629dbcb712
commit af36e74d05

View File

@ -130,8 +130,8 @@ static NSString* toBase64(NSData* data) {
[self.commandDelegate runInBackground:^{ [self.commandDelegate runInBackground:^{
CDVPictureOptions* pictureOptions = [CDVPictureOptions createFromTakePictureArguments:command]; CDVPictureOptions* pictureOptions = [CDVPictureOptions createFromTakePictureArguments:command];
pictureOptions.popoverSupported = [self popoverSupported]; pictureOptions.popoverSupported = [weakSelf popoverSupported];
pictureOptions.usesGeolocation = [self usesGeolocation]; pictureOptions.usesGeolocation = [weakSelf usesGeolocation];
pictureOptions.cropToSize = NO; pictureOptions.cropToSize = NO;
BOOL hasCamera = [UIImagePickerController isSourceTypeAvailable:pictureOptions.sourceType]; BOOL hasCamera = [UIImagePickerController isSourceTypeAvailable:pictureOptions.sourceType];
@ -142,13 +142,6 @@ static NSString* toBase64(NSData* data) {
return; 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]; CDVCameraPicker* cameraPicker = [CDVCameraPicker createFromPictureOptions:pictureOptions];
weakSelf.pickerController = cameraPicker; 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 // we need to capture this state for memory warnings that dealloc this object
cameraPicker.webView = weakSelf.webView; cameraPicker.webView = weakSelf.webView;
// 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];
}
if ([weakSelf popoverSupported] && (pictureOptions.sourceType != UIImagePickerControllerSourceTypeCamera)) { if ([weakSelf popoverSupported] && (pictureOptions.sourceType != UIImagePickerControllerSourceTypeCamera)) {
if (cameraPicker.pickerPopoverController == nil) { if (cameraPicker.pickerPopoverController == nil) {
cameraPicker.pickerPopoverController = [[NSClassFromString(@"UIPopoverController") alloc] initWithContentViewController:cameraPicker]; cameraPicker.pickerPopoverController = [[NSClassFromString(@"UIPopoverController") alloc] initWithContentViewController:cameraPicker];
} }
[weakSelf displayPopover:pictureOptions.popoverOptions]; [weakSelf displayPopover:pictureOptions.popoverOptions];
weakSelf.hasPendingOperation = NO; weakSelf.hasPendingOperation = NO;
} else { } else {
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf.viewController presentViewController:cameraPicker animated:YES completion:^{ [weakSelf.viewController presentViewController:cameraPicker animated:YES completion:^{
weakSelf.hasPendingOperation = NO; weakSelf.hasPendingOperation = NO;
}]; }];
});
} }
});
}]; }];
} }