Wait until the sync has stopped before marking the task as complete. (#3564)

This commit is contained in:
Doug 2024-11-28 17:30:07 +00:00 committed by GitHub
parent d48fb64468
commit 4869dcfe97
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 54 additions and 13 deletions

View File

@ -882,12 +882,12 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
// MARK: - Application State // MARK: - Application State
private func stopSync(isBackgroundTask: Bool) { private func stopSync(isBackgroundTask: Bool, completion: (() -> Void)? = nil) {
if isBackgroundTask, UIApplication.shared.applicationState == .active { if isBackgroundTask, UIApplication.shared.applicationState == .active {
// Attempt to stop the background task sync loop cleanly, only if the app not already running // Attempt to stop the background task sync loop cleanly, only if the app not already running
return return
} }
userSession?.clientProxy.stopSync() userSession?.clientProxy.stopSync(completion: completion)
clientProxyObserver = nil clientProxyObserver = nil
} }
@ -968,9 +968,11 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
backgroundTask = appMediator.beginBackgroundTask { [weak self] in backgroundTask = appMediator.beginBackgroundTask { [weak self] in
guard let self else { return } guard let self else { return }
stopSync(isBackgroundTask: true) MXLog.info("Background task is about to expire.")
stopSync(isBackgroundTask: true) { [weak self] in
if let backgroundTask { guard let self, let backgroundTask else { return }
MXLog.info("Ending background task.")
appMediator.endBackgroundTask(backgroundTask) appMediator.endBackgroundTask(backgroundTask)
self.backgroundTask = nil self.backgroundTask = nil
} }
@ -1026,10 +1028,12 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
scheduleBackgroundAppRefresh() scheduleBackgroundAppRefresh()
task.expirationHandler = { [weak self] in task.expirationHandler = { [weak self] in
self?.stopSync(isBackgroundTask: true) MXLog.info("Background app refresh task is about to expire.")
MXLog.info("Background app refresh task expired") self?.stopSync(isBackgroundTask: true) {
task.setTaskCompleted(success: true) MXLog.info("Marking Background app refresh task as complete.")
task.setTaskCompleted(success: true)
}
} }
guard let userSession else { guard let userSession else {
@ -1047,13 +1051,14 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
.sink(receiveValue: { [weak self] _ in .sink(receiveValue: { [weak self] _ in
guard let self else { return } guard let self else { return }
MXLog.info("Background app refresh finished") MXLog.info("Background app refresh finished")
backgroundRefreshSyncObserver?.cancel()
// Make sure we stop the sync loop, otherwise the ongoing request is immediately // Make sure we stop the sync loop, otherwise the ongoing request is immediately
// handled the next time the app refreshes, which can trigger timeout failures. // handled the next time the app refreshes, which can trigger timeout failures.
stopSync(isBackgroundTask: true) stopSync(isBackgroundTask: true) {
backgroundRefreshSyncObserver?.cancel() MXLog.info("Marking Background app refresh task as complete.")
task.setTaskCompleted(success: true)
task.setTaskCompleted(success: true) }
}) })
} }
} }

View File

@ -2346,6 +2346,41 @@ class ClientProxyMock: ClientProxyProtocol {
stopSyncCallsCount += 1 stopSyncCallsCount += 1
stopSyncClosure?() stopSyncClosure?()
} }
//MARK: - stopSync
var stopSyncCompletionUnderlyingCallsCount = 0
var stopSyncCompletionCallsCount: Int {
get {
if Thread.isMainThread {
return stopSyncCompletionUnderlyingCallsCount
} else {
var returnValue: Int? = nil
DispatchQueue.main.sync {
returnValue = stopSyncCompletionUnderlyingCallsCount
}
return returnValue!
}
}
set {
if Thread.isMainThread {
stopSyncCompletionUnderlyingCallsCount = newValue
} else {
DispatchQueue.main.sync {
stopSyncCompletionUnderlyingCallsCount = newValue
}
}
}
}
var stopSyncCompletionCalled: Bool {
return stopSyncCompletionCallsCount > 0
}
var stopSyncCompletionClosure: (((() -> Void)?) -> Void)?
func stopSync(completion: (() -> Void)?) {
stopSyncCompletionCallsCount += 1
stopSyncCompletionClosure?(completion)
}
//MARK: - accountURL //MARK: - accountURL
var accountURLActionUnderlyingCallsCount = 0 var accountURLActionUnderlyingCallsCount = 0

View File

@ -305,7 +305,7 @@ class ClientProxy: ClientProxyProtocol {
stopSync(completion: nil) stopSync(completion: nil)
} }
private func stopSync(completion: (() -> Void)?) { func stopSync(completion: (() -> Void)?) {
MXLog.info("Stopping sync") MXLog.info("Stopping sync")
if restartTask != nil { if restartTask != nil {

View File

@ -123,6 +123,7 @@ protocol ClientProxyProtocol: AnyObject, MediaLoaderProtocol {
func startSync() func startSync()
func stopSync() func stopSync()
func stopSync(completion: (() -> Void)?) // Hopefully this will become async once we get SE-0371.
func accountURL(action: AccountManagementAction) async -> URL? func accountURL(action: AccountManagementAction) async -> URL?