diff --git a/Nextcloud.xcodeproj/project.pbxproj b/Nextcloud.xcodeproj/project.pbxproj index 36507c1f2b..1d16333379 100644 --- a/Nextcloud.xcodeproj/project.pbxproj +++ b/Nextcloud.xcodeproj/project.pbxproj @@ -5728,7 +5728,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = NKUJUXUJ3B; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -5794,7 +5794,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = NKUJUXUJ3B; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; diff --git a/iOSClient/Networking/NCNetworkingProcess.swift b/iOSClient/Networking/NCNetworkingProcess.swift index fb4f4bb7e8..aa94633a71 100644 --- a/iOSClient/Networking/NCNetworkingProcess.swift +++ b/iOSClient/Networking/NCNetworkingProcess.swift @@ -18,6 +18,13 @@ actor NCNetworkingProcess { private let networking = NCNetworking.shared private var currentTask: Task? + + @MainActor + private var currentUploadTask: Task<(account: String, file: NKFile?, error: NKError), Never>? + + @MainActor + private var currentUploadRequest: UploadRequest? + private var enableControllingScreenAwake = true private var currentAccount = "" private var inWaitingCount: Int = 0 @@ -54,6 +61,8 @@ actor NCNetworkingProcess { Task { await self.stopTimer() + await self.cancelCurrentTaskOnBackground() + await self.cancelCurrentUpload() } } @@ -146,6 +155,19 @@ actor NCNetworkingProcess { timer = nil } + private func cancelCurrentTaskOnBackground() { + currentTask?.cancel() + currentTask = nil + } + + @MainActor + private func cancelCurrentUpload() async { + self.currentUploadTask?.cancel() + self.currentUploadRequest?.cancel() + self.currentUploadTask = nil + self.currentUploadRequest = nil + } + private func handleTimerTick() async { if currentTask != nil { print("[NKLOG] current task is running") @@ -157,6 +179,10 @@ actor NCNetworkingProcess { currentTask = nil } + if Task.isCancelled { + return + } + guard networking.isOnline, !currentAccount.isEmpty, networking.noServerErrorAccount(currentAccount) @@ -207,6 +233,10 @@ actor NCNetworkingProcess { ScreenAwakeManager.shared.mode = resultsScreenAwake.isEmpty && !hasSyncTask ? .off : NCPreferences().screenAwakeMode } + if Task.isCancelled { + return + } + await runMetadataPipelineAsync(metadatas: metadatas) // TODO: Check temperature @@ -358,19 +388,14 @@ actor NCNetworkingProcess { // UPLOAD E2EE // if metadata.isDirectoryE2EE { - var currentUploadTask: Task<(account: String, file: NKFile?, error: NKError), Never>? - var request: UploadRequest? let controller = await getController(account: metadata.account, sceneIdentifier: metadata.sceneIdentifier) let scene = await SceneManager.shared.getWindow(sceneIdentifier: metadata.sceneIdentifier)?.windowScene let token = await showUploadBanner(scene: scene, blocksTouches: true, onButtonTap: { - if let currentUploadTask { - currentUploadTask.cancel() - } - if let request { - request.cancel() + Task { + await self.cancelCurrentUpload() } }) @@ -378,9 +403,13 @@ actor NCNetworkingProcess { controller: controller, stageBanner: .button, tokenBanner: token) { uploadRequest in - request = uploadRequest + Task {@MainActor in + self.currentUploadRequest = uploadRequest + } } currentUploadTask: { task in - currentUploadTask = task + Task {@MainActor in + self.currentUploadTask = task + } } // wait dismiss banner before open another (loop) @@ -405,7 +434,6 @@ actor NCNetworkingProcess { @MainActor func uploadChunk(metadata: tableMetadata) async { - var currentUploadTask: Task<(account: String, file: NKFile?, error: NKError), Never>? var tokenBanner: Int? let scene = SceneManager.shared.getWindow(sceneIdentifier: metadata.sceneIdentifier)?.windowScene @@ -416,9 +444,8 @@ actor NCNetworkingProcess { stage: .button, allowMinimizeOnTap: true, onButtonTap: { - if let currentUploadTask { - currentUploadTask.cancel() - } else { + Task { + await self.cancelCurrentUpload() LucidBanner.shared.dismiss() } })