From 4d5d808675a2e2eb56aeca532e28628d5a06ace0 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Thu, 27 Apr 2017 15:11:00 -0400 Subject: [PATCH] Ensure push token update job runs to completion Promises must be retained. // FREEBIE --- Signal/src/Models/SyncPushTokensJob.swift | 27 ++++++++++++++--------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/Signal/src/Models/SyncPushTokensJob.swift b/Signal/src/Models/SyncPushTokensJob.swift index 0dafe2b17..67918bae4 100644 --- a/Signal/src/Models/SyncPushTokensJob.swift +++ b/Signal/src/Models/SyncPushTokensJob.swift @@ -11,6 +11,8 @@ class SyncPushTokensJob : NSObject { let accountManager: AccountManager let preferences: PropertyListPreferences var uploadOnlyIfStale = true + // useful to ensure promise runs to completion + var retainCycle: SyncPushTokensJob? required init(pushManager: PushManager, accountManager: AccountManager, preferences: PropertyListPreferences) { self.pushManager = pushManager @@ -29,29 +31,32 @@ class SyncPushTokensJob : NSObject { func run() -> Promise { Logger.debug("\(TAG) Starting.") + // Make sure we don't GC until completion. + self.retainCycle = self // Required to potentially prompt user for notifications settings // before `requestPushTokens` will return. self.pushManager.validateUserNotificationSettings() return self.requestPushTokens().then { (pushToken: String, voipToken: String) in - - if self.preferences.getPushToken() == pushToken && self.preferences.getVoipToken() == voipToken { - Logger.debug("\(self.TAG) push tokens are already up to date.") - if (self.uploadOnlyIfStale) { - return Promise { fulfill, reject in fulfill(); } - } else { - Logger.debug("\(self.TAG) proceeding with upload even though tokens aren't stale") - } - } else { + var shouldUploadTokens = !self.uploadOnlyIfStale + if self.preferences.getPushToken() != pushToken || self.preferences.getVoipToken() != voipToken { Logger.debug("\(self.TAG) push tokens changed.") + shouldUploadTokens = true + } + + guard shouldUploadTokens else { + Logger.info("\(self.TAG) skipping push token upload") + return Promise(value: ()) } - Logger.debug("\(self.TAG) Sending new tokens to account servers.") + Logger.info("\(self.TAG) Sending new tokens to account servers.") return self.accountManager.updatePushTokens(pushToken:pushToken, voipToken:voipToken).then { Logger.info("\(self.TAG) Recording tokens locally.") - return self.recordNewPushTokens(pushToken:pushToken, voipToken:voipToken); + return self.recordNewPushTokens(pushToken:pushToken, voipToken:voipToken) } + }.always { + self.retainCycle = nil } }