Skip to content

Commit

Permalink
Stop the sync loop after each background app refresh. (#3481)
Browse files Browse the repository at this point in the history
  • Loading branch information
pixlwave authored Nov 4, 2024
1 parent 6190a03 commit 85d497a
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
8 changes: 6 additions & 2 deletions ElementX/Sources/Application/AppCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -988,7 +988,8 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
// This is important for the app to keep refreshing in the background
scheduleBackgroundAppRefresh()

task.expirationHandler = {
task.expirationHandler = { [weak self] in
self?.stopSync() // Attempt to stop the sync loop cleanly.
MXLog.info("Background app refresh task expired")
task.setTaskCompleted(success: true)
}
Expand All @@ -1007,8 +1008,11 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
.collect(.byTimeOrCount(DispatchQueue.main, .seconds(10), 10))
.sink(receiveValue: { [weak self] _ in
guard let self else { return }

MXLog.info("Background app refresh finished")

// 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.
stopSync()
backgroundRefreshSyncObserver?.cancel()

task.setTaskCompleted(success: true)
Expand Down
11 changes: 10 additions & 1 deletion ElementX/Sources/Services/Client/ClientProxy.swift
Original file line number Diff line number Diff line change
Expand Up @@ -306,15 +306,24 @@ class ClientProxy: ClientProxyProtocol {
restartTask = nil
}

guard let syncService else {
MXLog.warning("No sync service to stop.")
completion?()
return
}

// Capture the sync service strongly as this method is called on deinit and so the
// existence of self when the Task executes is questionable and would sometimes crash.
// Note: This isn't strictly necessary now given the unwrap above, but leaving the code as
// documentation. SE-0371 will allow us to fix this by using an async deinit.
Task { [syncService] in
do {
defer {
completion?()
}

try await syncService?.stop()
try await syncService.stop()
MXLog.info("Sync stopped")
} catch {
MXLog.error("Failed stopping the sync service with error: \(error)")
}
Expand Down

0 comments on commit 85d497a

Please sign in to comment.