App extension - Improvement: Reduce memory consumption.

Force the ShareExtensionManager to release the primary view controller when the action is completed.

We observed that `dealloc` is called for this view controller when the request is cancelled with error (`cancelRequestWithError`), but it is not called when the request is completed (`completeRequestReturningItems`).
This commit is contained in:
Giom Foret
2017-08-25 11:55:37 +02:00
parent 84f3aefac4
commit be2fe8fea9
6 changed files with 79 additions and 22 deletions
@@ -15,6 +15,7 @@
*/
#import "ShareExtensionManager.h"
#import "SharePresentingViewController.h"
#import "MXKPieChartHUD.h"
@import MobileCoreServices;
@@ -60,8 +61,12 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
[[NSNotificationCenter defaultCenter] addObserver:sharedInstance selector:@selector(checkUserAccount) name:NSExtensionHostWillEnterForegroundNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:sharedInstance selector:@selector(suspendSession) name:NSExtensionHostDidEnterBackgroundNotification object:nil];
MXSDKOptions *sdkOptions = [MXSDKOptions sharedInstance];
// Apply the application group
[MXSDKOptions sharedInstance].applicationGroupIdentifier = @"group.im.vector";
sdkOptions.applicationGroupIdentifier = @"group.im.vector";
// Disable identicon use
sdkOptions.disableIdenticonUseForUserAvatar = YES;
});
return sharedInstance;
}
@@ -293,10 +298,23 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
{
[self.shareExtensionContext cancelRequestWithError:[NSError errorWithDomain:@"MXFailureErrorDomain" code:500 userInfo:nil]];
}
[self.primaryViewController destroy];
self.primaryViewController = nil;
}
#pragma mark - Private
- (void)completeRequestReturningItems:(nullable NSArray *)items completionHandler:(void(^ __nullable)(BOOL expired))completionHandler;
{
[self suspendSession];
[self.shareExtensionContext completeRequestReturningItems:items completionHandler:completionHandler];
[self.primaryViewController destroy];
self.primaryViewController = nil;
}
- (UIAlertController *)compressionPromptForImage:(UIImage *)image shareBlock:(void(^)())shareBlock
{
UIAlertController *compressionPrompt;
@@ -484,8 +502,7 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
if (weakSelf)
{
typeof(self) self = weakSelf;
[self suspendSession];
[self.shareExtensionContext completeRequestReturningItems:@[extensionItem] completionHandler:nil];
[self completeRequestReturningItems:@[extensionItem] completionHandler:nil];
}
} failure:^(NSError *error) {
NSLog(@"[ShareExtensionManager] sendTextMessage failed.");
@@ -520,8 +537,7 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
if (weakSelf)
{
typeof(self) self = weakSelf;
[self suspendSession];
[self.shareExtensionContext completeRequestReturningItems:@[extensionItem] completionHandler:nil];
[self completeRequestReturningItems:@[extensionItem] completionHandler:nil];
}
} failure:^(NSError *error) {
NSLog(@"[ShareExtensionManager] sendFile failed.");
@@ -594,8 +610,7 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
if (weakSelf)
{
typeof(self) self = weakSelf;
[self suspendSession];
[self.shareExtensionContext completeRequestReturningItems:@[extensionItem] completionHandler:nil];
[self completeRequestReturningItems:@[extensionItem] completionHandler:nil];
}
} failure:^(NSError *error) {
NSLog(@"[ShareExtensionManager] sendImage failed.");
@@ -635,8 +650,7 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
if (weakSelf)
{
typeof(self) self = weakSelf;
[self suspendSession];
[self.shareExtensionContext completeRequestReturningItems:@[extensionItem] completionHandler:nil];
[self completeRequestReturningItems:@[extensionItem] completionHandler:nil];
}
} failure:^(NSError *error) {
NSLog(@"[ShareExtensionManager] sendVideo failed.");